Python递归二分查找函数如何设置依赖前置参数的默认值?
Python递归二分查找的默认参数问题
你直接写def binary_search(myarray, start=0, end=len(myarray))是不行的,会直接报错。原因很简单:Python函数的默认参数是在函数定义阶段就计算求值的,这时候myarray作为函数的参数还没被传入,解释器根本不知道它是什么,会抛出NameError: name 'myarray' is not defined。
给你两种靠谱的解决办法:
方法一:用None作为end的默认值,函数内部动态计算
把end的默认值设为None,然后在函数开头判断,如果是None就赋值为数组的有效索引(注意区分区间类型:闭区间还是左闭右开):
def binary_search(myarray, target, start=0, end=None): # 处理end的默认值:闭区间搜索[start, end]用len(myarray)-1 # 左闭右开[start, end)则用len(myarray),根据你的递归逻辑调整 if end is None: end = len(myarray) - 1 # 递归终止条件:区间无效,说明没找到目标 if start > end: return -1 mid = (start + end) // 2 if myarray[mid] == target: return mid elif myarray[mid] < target: # 目标在右半区间,递归搜索 return binary_search(myarray, target, mid + 1, end) else: # 目标在左半区间,递归搜索 return binary_search(myarray, target, start, mid - 1)
外部调用时直接传数组和目标值即可:binary_search([1,3,5,7], 5),内部会自动处理start和end的初始值。
方法二:用嵌套函数分离外部调用和递归逻辑
写一个对外的包装函数,内部定义真正的递归函数,让外部调用无需关心区间参数:
def binary_search(myarray, target): def _recursive_search(start, end): if start > end: return -1 mid = (start + end) // 2 if myarray[mid] == target: return mid elif myarray[mid] < target: return _recursive_search(mid + 1, end) else: return _recursive_search(start, mid - 1) # 初始调用递归函数,传入默认的区间参数 return _recursive_search(0, len(myarray)-1)
这种方式更贴合“外部调用不用管start和end”的需求,用户只需传入数组和目标值。
另外提醒:你的原始函数没包含target参数,二分查找必须指定要搜索的目标值,上面的例子已经补上,可根据实际需求调整。
内容的提问来源于stack exchange,提问作者Erel Segal-Halevi
相关产品推荐
相关产品推荐

