Python函数之递归(用递归实现二分查找)

本文深入探讨了递归的基本概念,通过阶乘计算的实例进行说明,并详细介绍了二分查找法的代码实现过程,包括对序列的排序及查找操作的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归:简单来说就是引用(或者调用)自身的意思。

#阶乘
def factorical(n):
    result=n
    for i in range(1,n):
        result *=i
    return result
print(factorical(12))


输出:
479001600

代码实现二分查找法:

#实现二分查找法
def search(sequence, number, lower=0, upper=None):
    if upper is None: upper = len(sequence) - 1  #如果不加这两句会出现‘TypeError: search() missing 2 required positional arguments: 'lower' and 'upper'’,这种错误
    if lower == upper:
        assert number == sequence[upper]
        return upper
    else:
        middle = (lower + upper) // 2
        if number > sequence[middle]:
            return search(sequence, number, middle + 1, upper)
        else:
            return search(sequence, number, lower, middle)


seq = [34, 67, 8, 123, 4, 100, 95]
seq.sort()
print(seq)
print(search(seq, 34))


输出:
[4, 8, 34, 67, 95, 100, 123]
2

 

### 递归实现二分查找算法Python中,可以通过递归的方式实现经典的二分查找算法。该算法适用于**有序且可索引的序列**,其核心思想是通过不断将搜索区间折半来快速定位目标值的位置。递归实现的关键在于定义明确的终止条件以及如何缩小搜索范围。 以下是一个使用递归方法实现二分查找函数: ```python def binary_search_recursive(arr, target, low, high): if low > high: return -1 # 表示未找到目标值 mid = (low + high) // 2 if arr[mid] == target: return mid elif arr[mid] < target: return binary_search_recursive(arr, target, mid + 1, high) else: return binary_search_recursive(arr, target, low, mid - 1) ``` #### 示例用法: ```python l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88] target = 66 result = binary_search_recursive(l, target, 0, len(l) - 1) if result != -1: print(f"目标值 {target} 在列表中的索引为: {result}") else: print("目标值不在列表中") ``` #### 输出结果: ``` 目标值 66 在列表中的索引为: 17 ``` --- ### 注意事项优化建议 - **递归深度限制**:Python默认的最大递归深度为998次[^2],如果据规模较大,可能会导致`RecursionError`异常。对于非常大的组,建议使用非递归(迭代)方式实现。 - **时间复杂度**:二分查找的时间复杂度为 $O(\log n)$,这使得它比线性查找更高效,尤其是在处理大规模据时。 - **适用场景**:二分查找仅适用于**已排序**的组或列表。若输入序列未排序,则需先进行排序操作。 --- ### 总结 递归实现二分查找代码简洁且逻辑清晰,但需要注意递归深度问题和终止条件设置。该算法适用于需要频繁查找特定元素的场景,尤其在据量较大的情况下表现优异。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值