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

问询:实现带4参数的有序子序列递归二分查找算法

实现递归二分查找(返回存在位置或插入位置)

没问题!我来帮你搞定这个递归二分查找算法,完全符合你说的参数要求和返回逻辑。咱们先理清楚核心思路,再上代码:

核心逻辑梳理

递归二分查找的关键是不断缩小搜索范围,直到触发基线条件:

  • 当first > last时,说明目标值不在当前子序列里,这时候first就是它应该插入的位置(因为所有左边的元素都比target小,右边的都比它大)。
  • 每次计算中间索引mid,对比target和list[mid]:
    • 相等就直接返回mid,找到位置了;
    • target更小就去左半子序列继续找(调整last = mid - 1);
    • target更大就去右半子序列找(调整first = mid + 1)。

代码实现(Python)

def recursive_binary_search(arr, first, last, target):
    # 基线条件:没找到目标,返回插入位置
    if first > last:
        return first
    
    # 计算中间索引,避免溢出可以用 first + (last - first) // 2
    mid = (first + last) // 2
    
    if arr[mid] == target:
        return mid
    elif arr[mid] > target:
        # 目标在左半部分,递归搜索左子序列
        return recursive_binary_search(arr, first, mid - 1, target)
    else:
        # 目标在右半部分,递归搜索右子序列
        return recursive_binary_search(arr, mid + 1, last, target)

测试案例验证

咱们来试几个例子看看效果:

# 测试存在目标值的情况
sorted_arr = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91]
print(recursive_binary_search(sorted_arr, 0, len(sorted_arr)-1, 23))  # 输出:5(正确位置)

# 测试不存在目标值的情况,返回插入位置
print(recursive_binary_search(sorted_arr, 0, len(sorted_arr)-1, 10))  # 输出:3(应该插在8和12之间)
print(recursive_binary_search(sorted_arr, 0, len(sorted_arr)-1, 100)) # 输出:10(插在末尾)
print(recursive_binary_search(sorted_arr, 0, len(sorted_arr)-1, 1))   # 输出:0(插在开头)

关键点说明

  • 为什么基线条件返回first?当first > last时,说明所有比target小的元素都在first左边,比它大的在右边,所以插入first的位置刚好能保持序列有序。
  • 计算mid的时候,如果担心first + last溢出(比如处理极大的列表),可以换成first + (last - first) // 2,结果是一样的,更安全。
  • 注意输入的列表必须是有序的,二分查找的前提就是有序序列,不然结果会出错哦!

内容的提问来源于stack exchange,提问作者Owen Brain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:44:08