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

递归实现二分查找与插入排序遇缩进错误,求问题排查方案

修复递归二分查找与插入排序的缩进/语法错误,实现一致输出

一、先解决递归二分查找的问题

你的二分查找代码里有个明显的语法错误,Python里没有else if:这种写法,正确的是elif,而且这里你根本不需要额外的分支判断,直接在else块里对比元素和中间值的大小即可。另外代码整体缩进没问题,但那个错误语法会直接导致编译失败。

修正后的递归二分查找代码:

def binarySearch(alist, item):
    if len(alist) == 0:
        return False
    else:
        midpoint = len(alist) // 2
        if alist[midpoint] == item:
            return True
        # 去掉错误的else if:,直接判断元素和中间值的大小关系
        if item < alist[midpoint]:
            return binarySearch(alist[:midpoint], item)
        else:
            return binarySearch(alist[midpoint+1:], item)

testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(binarySearch(testlist, 3))  # 输出False
print(binarySearch(testlist, 13)) # 输出True

二、递归插入排序的问题更集中:缩进混乱+逻辑缺失

你的插入排序代码有几个核心问题:

  1. 函数定义没接收i参数,但内部直接用了i,得给i加默认值i=1(插入排序从第二个元素开始处理)
  2. 函数外的while循环完全没缩进,属于全局代码,而且position和currentvalue都没定义,会直接报错
  3. 递归逻辑混杂,把两种插入逻辑揉在了一起,导致代码完全无法正常运行

我整理了两种符合递归思维的插入排序写法,保证排序后输出和你二分查找的测试列表一致:

写法一:从后往前递归(更贴合递归拆分问题的思路)

def insertionSort(arr):
    # 递归终止条件:列表长度<=1时无需排序
    if len(arr) <= 1:
        return arr
    # 先递归排序前n-1个元素
    sorted_part = insertionSort(arr[:-1])
    # 取出最后一个元素,插入到已排序部分的正确位置
    last_element = arr[-1]
    i = len(sorted_part) - 1
    # 找到合适的插入位置
    while i >= 0 and sorted_part[i] > last_element:
        i -= 1
    # 插入元素并返回
    sorted_part.insert(i + 1, last_element)
    return sorted_part

# 用无序列表测试,排序后和你的二分查找测试列表完全一致
unsorted_list = [13, 0, 42, 2, 19, 8, 1, 17, 32]
sorted_list = insertionSort(unsorted_list)
print(sorted_list)  # 输出[0, 1, 2, 8, 13, 17, 19, 32, 42]

写法二:从左到右逐个插入(贴近你原本的思路)

def insertionSort(arr, i=1):
    # 递归终止条件:i超出列表长度时返回已排序的列表
    if i >= len(arr):
        return arr
    current_value = arr[i]
    position = i
    # 把当前元素插入到前面已排序的正确位置
    while position > 0 and arr[position - 1] > current_value:
        arr[position] = arr[position - 1]
        position -= 1
    arr[position] = current_value
    # 递归处理下一个元素
    return insertionSort(arr, i + 1)

unsorted_list = [13, 0, 42, 2, 19, 8, 1, 17, 32]
insertionSort(unsorted_list)
print(unsorted_list)  # 输出[0, 1, 2, 8, 13, 17, 19, 32, 42]

三、测试验证

现在两个递归函数都能正常运行,插入排序输出的有序列表和你二分查找用的测试列表完全一致,你可以直接用排序后的列表作为二分查找的输入进行测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:42:23