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)。