Python二分查找切片疑问:为何切片不符预期却得正确结果?
二分查找切片显示异常但结果正确的原因分析
核心问题:打印切片与实际搜索区间不匹配
你代码里打印的arr[start:end]没法准确反映当前递归真正处理的元素范围——你的递归逻辑是基于原数组的索引区间[start, end](包含两端),但Python切片arr[start:end]是左闭右开(包含start,不包含end),两者的范围定义不一致,这才导致切片显示和你预期不符。
逐步骤拆解执行流程
以搜索目标值6为例,一步步还原实际执行逻辑:
- 第一次调用:
binarySearch(arr, 0, 7, 6)
打印arr[0:7]→[4,5,6,7,8,11,20],符合预期;mid_idx=(0+7)//2=3,对应元素7>6,递归调用binarySearch(arr, 0, 2, 6) - 第二次调用:
binarySearch(arr, 0, 2, 6)
你预期处理[4,5,6],但打印arr[0:2]只会输出[4,5](因为切片不包含end=2的元素)。但实际递归处理的是原数组索引0到2的所有元素(包含索引2),也就是[4,5,6];mid_idx=(0+2)//2=1,对应元素5<6,递归调用binarySearch(arr, 2, 2, 6) - 第三次调用:
binarySearch(arr,2,2,6)
打印arr[2:2]得到空数组,但此时start=end=2满足判断条件,实际处理的是原数组索引2的元素6;mid_idx=(2+2)//2=2,匹配成功返回索引2,结果正确。
修正打印逻辑的方法
如果想让打印的切片和实际处理的元素一致,只需把打印语句改成左闭右闭的范围:
print('the input array is: ' + str(arr[start:end+1]))
修改后第二次调用会打印arr[0:3] → [4,5,6],第三次调用打印arr[2:3] → [6],和你的预期流程完全匹配。
总结
你的二分查找核心逻辑是正确的——递归时始终基于原数组的索引计算mid,没有依赖切片的索引。切片显示异常只是打印语句的范围定义和实际搜索区间不匹配导致的,完全不影响算法的正确性。
内容的提问来源于stack exchange,提问作者Dec0de
相关产品推荐
相关产品推荐

