You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python二分法猜数程序输入大列表长度时冻结问题求助

问题分析与解决方法

核心问题:二分法逻辑存在死循环

程序在列表大小增大后冻结,根源是二分法的猜数逻辑有漏洞,当目标数处于区间边界(比如Random_Number = t2且t2 = t1 + 1时),会陷入无限循环:

  • 示例场景:t1=3,t2=4,目标数是4
  • 计算Y = int(0.5*(4-3)) +3 = 3
  • 因Y < Random_Number,t1被设为3,下一次循环计算的Y仍为3,永远无法命中目标,循环永不终止。

修复后的代码

import random

Max_Number = input()
Size_Liste = input()

if Max_Number.isdigit() and Size_Liste.isdigit():
    Max_Number = int(Max_Number)
    Size_Liste = int(Size_Liste)
else:
    print("Please Enter A Positive Integer. Goodbye!")
    quit()
   
NG = []  # 存储每次猜数的次数

while len(NG) != Size_Liste:
    Random_Number = random.randint(0, Max_Number)
    t1 = 0
    t2 = Max_Number
    Num_Guesses = 0
   
    while True:
        # 改用整数除法避免浮点计算误差,同时调整区间更新逻辑
        Y = (t1 + t2) // 2
        Num_Guesses += 1
       
        if Y == Random_Number:
            break
        elif Y > Random_Number:
            # 目标在左半区间,直接把右边界设为Y-1,缩小范围
            t2 = Y - 1
        else:
            # 目标在右半区间,直接把左边界设为Y+1
            t1 = Y + 1
   
    NG.append(Num_Guesses)

print(NG)

关键优化点

  • 替换浮点计算为整数除法(t1 + t2) // 2,避免浮点精度问题,更符合二分法的整数区间处理逻辑
  • 调整区间更新规则:猜数大于目标时右边界设为Y-1,小于目标时左边界设为Y+1,彻底规避边界值死循环
  • 移除未使用的math和numpy库,减少不必要依赖
  • 修正输入判断逻辑(原代码isdigit() >0错误,isdigit()返回布尔值,直接判断即可)

内容的提问来源于stack exchange,提问作者A. E. Fahim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:40:22