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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:51:01