如何实现分治二分搜索打印中间临时数组并调试IndexError?
分治二分搜索打印中间数组的问题解决
原代码核心错误
- 全局变量滥用:
low、high、mid是全局变量,递归时不会随子数组更新,导致索引超出子数组长度,触发IndexError。 - 逻辑错误:用
while循环代替分治的分支判断,二分搜索是递归分支选择逻辑,不需要循环迭代。 - 参数传递错误:递归时传递原数组的
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
相关产品推荐
相关产品推荐

