Python二分查找猜数字游戏运行异常及索引错误问题求助
代码问题分析与修复方案
初始版本运行只走else分支的根因
- 边界计算错误:
upper_bound = len(str(stop)) - 1逻辑完全错误,该代码计算的是stop转字符串后的字符长度减1,而非数值区间的上限,导致二分查找的边界从初始化阶段就不符合预期 - 分支逻辑缺失:第二个if判断仅覆盖了
pivot_value > rand_number 且 tries>0的场景,剩余所有情况(包括pivot_value小于目标值、tries耗尽)都会直接进入else分支,触发提前返回
新版代码抛出IndexError的根因
你混淆了数值大小和列表索引的对应关系:range(start, stop+1)生成的序列索引从0开始,而你计算pivot用的是数值区间的上下限(比如start=20、stop=30时,首次计算pivot为25,但range(20,31)的最大索引仅为10),用超出列表长度的下标取值必然触发索引越界。
实际上二分查找数字区间完全不需要额外创建列表,pivot本身就是当前猜测的数值,直接用于判断即可。
修复后可正常运行的代码
import random def guess_random_number_binary(tries, start, stop): rand_number = random.randint(start, stop) lower_bound = start upper_bound = stop while lower_bound <= upper_bound: if tries <= 0: print("Ran out of tries! The target number is " + str(rand_number)) break pivot = (lower_bound + upper_bound) // 2 if pivot == rand_number: print("Found it! " + str(rand_number)) return pivot elif pivot > rand_number: upper_bound = pivot - 1 tries -= 1 print(f"Guessed {pivot} incorrectly \n{tries} Tries remaining") else: lower_bound = pivot + 1 tries -= 1 print(f"Guessed {pivot} incorrectly \n{tries} Tries remaining") # 测试调用 guess_random_number_binary(5, 20, 30)
内容的提问来源于stack exchange,提问作者JWingert
相关产品推荐
相关产品推荐

