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

如何实现分治二分搜索打印中间临时数组并调试IndexError?

分治二分搜索打印中间数组的问题解决

原代码核心错误

  1. 全局变量滥用:low、high、mid是全局变量,递归时不会随子数组更新,导致索引超出子数组长度,触发IndexError。
  2. 逻辑错误:用while循环代替分治的分支判断,二分搜索是递归分支选择逻辑,不需要循环迭代。
  3. 参数传递错误:递归时传递原数组的mid值到子数组中,子数组长度远小于原数组,必然出现索引越界。

修正后的代码(匹配示例输出)

如果需要完全匹配你给出的示例输出(不打印原数组,直接输出从第一个中间数组到结果的过程),可以使用以下代码:

def binary_search(subarray, target):
    print(subarray)
    mid = len(subarray) // 2
    if subarray[mid] == target:
        return True
    elif target < subarray[mid]:
        return binary_search(subarray[:mid], target)
    else:
        return binary_search(subarray[mid+1:], target)

# 主程序
array = [2, 4, 6, 8, 10, 12, 16, 17, 21, 32]
item = int(input("Search array: "))

# 初始分治,跳过原数组直接进入第一个中间数组
initial_mid = len(array) // 2
if item == array[initial_mid]:
    print([item])
elif item < array[initial_mid]:
    binary_search(array[:initial_mid], item)
else:
    binary_search(array[initial_mid+1:], item)

代码说明

  • 每次递归直接传递当前搜索的子数组,无需维护全局范围变量,从根源避免索引越界问题。
  • 进入函数先打印当前子数组,满足输出所有中间搜索过程的需求。
  • 基于当前子数组长度计算mid,确保索引始终有效。
  • 通过if-else分支选择左/右半子数组递归,严格遵循分治二分搜索的核心逻辑。

测试输出(搜索17)

[12, 16, 17, 21, 32]
[17, 21, 32]
[17]

通用版本(打印包括原数组的完整过程)

如果需要打印从原数组开始的完整搜索路径,使用更简洁的版本:

def binary_search(subarray, target):
    print(subarray)
    if not subarray:
        print("未找到目标元素")
        return False
    mid = len(subarray) // 2
    if subarray[mid] == target:
        return True
    elif target < subarray[mid]:
        return binary_search(subarray[:mid], target)
    else:
        return binary_search(subarray[mid+1:], target)

array = [2, 4, 6, 8, 10, 12, 16, 17, 21, 32]
item = int(input("Search array: "))
binary_search(array, item)

搜索17时输出:

[2, 4, 6, 8, 10, 12, 16, 17, 21, 32]
[12, 16, 17, 21, 32]
[17, 21, 32]
[17]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 16:33:25