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

Python递归二分搜索函数报错求助:索引类型错误

修正递归二分搜索函数解决TypeError问题

错误原因分析

触发TypeError: list indices must be integers or slices, not float的核心原因是计算中间索引mid时使用了普通除法/,该操作返回浮点数,而Python列表要求索引必须是整数类型。需改用整数除法//确保结果为整数。

满足计数要求的修正实现

递归调用计数和目标比较计数需用可变对象(比如列表)传递,因为整数是不可变类型,递归内部的修改无法同步到外部。以下是完整的binary_search()实现:

def binary_search(arr, target, low, high, recursion_count, compare_count):
    # 递归调用计数+1
    recursion_count[0] += 1
    
    # 基准情况:未找到目标
    if low > high:
        return -1
    
    # 计算整数类型的中间索引
    mid = (low + high) // 2
    
    # 目标比较计数+1
    compare_count[0] += 1
    if arr[mid] == target:
        return mid
    # 目标比较计数+1(与mid值的大小比较)
    compare_count[0] += 1
    elif arr[mid] > target:
        return binary_search(arr, target, low, mid - 1, recursion_count, compare_count)
    else:
        return binary_search(arr, target, mid + 1, high, recursion_count, compare_count)

使用示例

# 测试用有序列表
test_arr = [1, 3, 5, 7, 9, 11, 13]
target_val = 7

# 初始化计数(用列表包裹实现可变传递)
recursion_count = [0]
compare_count = [0]

result = binary_search(test_arr, target_val, 0, len(test_arr)-1, recursion_count, compare_count)

print(f"目标索引: {result}")
print(f"递归调用次数: {recursion_count[0]}")
print(f"目标比较次数: {compare_count[0]}")

错误栈对应修正说明

如果原代码中mid的计算是mid = (low + high) / 2,替换为mid = (low + high) // 2即可解决浮点数索引问题。同时通过列表传递计数变量,确保递归过程中计数能被正确累计。

内容的提问来源于stack exchange,提问作者ebfcodes101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:01:05