Python递归二分查找:如何用函数参数作为默认参数?
解决递归二分查找中默认参数依赖其他参数的问题
你遇到的items_list未定义错误,根源是Python函数的默认参数是在函数定义阶段求值的,而非调用阶段。此时items_list只是函数的参数名,还未绑定任何实际列表对象,所以len(items_list)会触发NameError。
核心解决方案:用None作为默认值,在函数内部动态计算
将upper的默认值设为None,在函数开头判断如果upper是None,就将其赋值为len(items_list)。这样既满足首次调用时不传上下界的需求,递归调用时也能正常传入自定义的上下界。
修正后的完整代码
你的原代码还有几处逻辑错误需要修正:
len(lower-upper)是错误写法,应通过判断搜索区间是否为空(如lower >= upper)来判定未找到目标- 采用左闭右开区间(
[lower, upper))更符合Python习惯,可避免访问items_list[len(items_list)]这类不存在的索引
修正后的代码如下:
from typing import List def binary_search(items_list: List[int], item: int, lower: int = 0, upper: int | None = None) -> bool: # 处理upper的默认值 if upper is None: upper = len(items_list) # 区间为空,未找到目标 if lower >= upper: return False middle = (lower + upper) // 2 if items_list[middle] == item: return True elif item < items_list[middle]: # 目标在左半区间,搜索[lower, middle) return binary_search(items_list, item, lower, middle) else: # 目标在右半区间,搜索[middle+1, upper) return binary_search(items_list, item, middle + 1, upper)
代码说明
- 首次调用
binary_search(my_list, 5)时,upper会自动设为len(my_list) - 递归调用时,手动传入调整后的
lower和upper实现区间缩小 - 左闭右开区间的设计避免了索引越界问题,逻辑更清晰
内容的提问来源于stack exchange,提问作者Hephaestois
相关产品推荐
相关产品推荐

