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
相关产品推荐
相关产品推荐

