以下是对递归和递推的详细补充说明,包含更多技术细节、应用场景和扩展示例:
1. 递归(Recursion)深入解析
核心原理
递归基于数学归纳法思想(在函数中调用自己):
- 基础步骤(Base Case):解决最小规模问题(如 n=0 或 n=1)
- 归纳步骤(Recursive Step):假设已解决规模 k-1 的问题,用其结果构建规模 k 的解
有一个很古老的表情包,生动的解释了递归的过程:
内存机制
- 调用栈(Call Stack):每次递归调用在栈中创建新帧(frame),包含:
- 局部变量
- 返回地址
- 函数参数
- 栈溢出风险:当递归深度过大(如斐波那契数列 n>1000),超出栈容量导致崩溃
高级类型
// 1. 直接递归
function direct(n):
if base_case: return
else: direct(n-1)
// 2. 间接递归(A→B→A)
function A(n):
if n==0: return 1
else: return B(n)
function B(n):
return A(n-1)*n
// 3. 尾递归(可优化为递推)
function tail_recursive(n, acc=1):
if n==0: return acc
else: return tail_recursive(n-1, acc*n)
复杂示例:汉诺塔问题
function hanoi(n, source, auxiliary, target):
if n == 1:
print("Move disk 1 from", source, "to", target)
return
// 递归步骤:
hanoi(n-1, source, target, auxiliary) // 将n-1个盘移到辅助柱
print("Move disk", n, "from", source, "to", target)
hanoi(n-1, auxiliary, source, target) // 将n-1个盘移到目标柱
// 调用:移动3个盘(A→C,B为辅助)
hanoi(3, 'A', 'B', 'C')