20.Python基础篇-递归

什么是递归:函数直接或间接调用自身的方法

 递归的基本结构

递归函数需要包括两个部分:

  • 基线条件(Base Case):确保递归调用的停止条件,防止无限递归。
  • 递归步骤(Recursive Step):每次调用递归函数时,将问题分解为更小的子问题,并递归处理。

递归的经典案例:1.阶乘

def factorial(n):
    if n == 1:  # 基线条件
        return 1
    else:
        return n * factorial(n - 1)  # 递归调用

递归的经典案例:2.斐波那契数列

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

使用递归实现二分查找算法

l =[2,3,5,10,15,16,18,22,26,30,32,35,41,43,55,56,66,67,69,72,76,82,83,88]
def find(l, aim, start_index=0,end_index=None):
    # 对结束索引初始化
    if end_index is None:
        end_index = len(l) - 1
    else:
        end_index = end_index

    mid_index = (end_index-start_index) // 2 + start_index  # 求每次的中间值
    # 开始索引如果小于结束索引,说明还有找到的可能。如果开始 > 结束,说明列表已经找遍了,都没有。
    if start_index <= end_index:
        # 如果中间值比目标值小,则目标值在右侧数据中。需要更新下次调用的开始位置,结束位置不变
        if l[mid_index] < aim:
            return find(l, aim, start_index=mid_index+1,end_index=end_index)
        # 如果中间值比目标值大,则目标值在左侧数据中。下次调用的开始位置不变,结束位置更新
        elif l[mid_index] > aim:
            return find(l, aim, start_index=start_index, end_index=mid_index-1)
        # 既不大于又不小于,则等于。即找到,返回索引
        else:
            return mid_index
    else:
        return '找不到'


print(find(l, 3))  # 1
print(l[1])  # 3。验证无误

 递归的优缺点

优点

  • 简洁性:递归可以使代码更简洁,特别是在处理树结构、分治算法等问题时。
  • 分解问题:递归通过逐步分解问题,使得复杂问题更易于理解和实现。

缺点

  • 效率低:大量递归会产生大量函数调用开销,特别是没有缓存的情况下。
  • 内存开销:递归会占用大量内存,可能导致栈溢出(Stack Overflow)。
posted @ 2024-10-30 14:02  邵杠杠  阅读(1)  评论(0编辑  收藏  举报