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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:13:10