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

Python递归二分查找:如何用函数参数作为默认参数?

解决递归二分查找中默认参数依赖其他参数的问题

你遇到的items_list未定义错误,根源是Python函数的默认参数是在函数定义阶段求值的,而非调用阶段。此时items_list只是函数的参数名,还未绑定任何实际列表对象,所以len(items_list)会触发NameError。

核心解决方案:用None作为默认值,在函数内部动态计算

将upper的默认值设为None,在函数开头判断如果upper是None,就将其赋值为len(items_list)。这样既满足首次调用时不传上下界的需求,递归调用时也能正常传入自定义的上下界。

修正后的完整代码

你的原代码还有几处逻辑错误需要修正:

  1. len(lower-upper)是错误写法,应通过判断搜索区间是否为空(如lower >= upper)来判定未找到目标
  2. 采用左闭右开区间([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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:18:21