递归作为编程中极具魅力的算法思想核心是函数调用自身将复杂问题拆解为规模更小的同类子问题直到触达 “边界条件”递归出口后逐层回溯最终解决原问题。这种 “大事化小、小事化了” 的思路能让代码简洁优雅尤其适合解决具有重复子结构的问题。本文将通过 4 个经典实例带你吃透递归的核心逻辑所有代码均可直接运行建议结合注释逐行理解递归的 “递” 与 “归”。一、阶乘算法递归的入门典范阶乘是递归最基础的应用场景。数学上n!n 的阶乘定义为边界条件0! 10 的阶乘为 1是人为规定的递归出口递归关系n! n × (n-1)!n0 时n 的阶乘等于 n 乘以 n-1 的阶乘代码实现#阶乘运算 def factorial(n): if n0: return 1 else: return factorial(n-1)*n nint(input()) print(f{n}的阶乘为{factorial(n)})逻辑解析以计算5!为例递归的执行过程是 “先递后归”递factorial(5)→ 调用factorial(4)→ 调用factorial(3)→ 调用factorial(2)→ 调用factorial(1)→ 调用factorial(0)归factorial(0)返回 1 →factorial(1)1×11→factorial(2)1×22→factorial(3)2×36→factorial(4)6×424→factorial(5)24×5120。二、斐波那契数列递归解决递推关系问题斐波那契数列是经典的递推数列其核心规律为边界条件第 1 位和第 2 位均为 1F(1)1F(2)1递归关系从第 3 位开始每一位等于前两位之和F(n) F(n-1) F(n-2)。代码实现#第n个斐波那契数 def fibonacci(n): if n1 or n2: return 1 else: return fibonacci(n-1) fibonacci(n-2) nint(input()) print(f第{n}个斐波那契数为{fibonacci(n)})逻辑解析计算第 5 个斐波那契数时递归会拆解为fibonacci(5) fibonacci(4) fibonacci(3)fibonacci(4) fibonacci(3) fibonacci(2)fibonacci(3) fibonacci(2) fibonacci(1)当触达n1或n2的边界条件后开始回溯求和最终得到fibonacci(5)5。注纯递归实现斐波那契数列存在重复计算问题如fibonacci(3)会被计算多次适合理解递归逻辑实际开发中可结合记忆化缓存优化效率。三、全排列问题递归拆解 “选元素 排剩余”全排列是指从 n 个不同元素中取出所有元素按任意顺序排列最终得到所有可能的排列组合。递归解决全排列的核心思路是边界条件若列表只剩 1 个元素其全排列就是自身递归关系遍历列表中的每个元素将其作为 “第一个元素”再对剩余元素递归求全排列最终拼接所有结果。代码实现#全排列问题 def full_permutation(list): if len(list)1: #如果列表中的元素仅有一个那么直接输出 return [list] #返回[list]而非list保证递归拼接类型一致 result[] for i in range(len(list)): #遍历列表 firstlist[i] #选择任意一个作为第一个 restlist[:i]list[i1:] #构造剩余元素组成的列表 for j in full_permutation(rest): #递归对剩余元素组成的列表如上操作接着第二个位置往后依次添加 result.append([first]j) #将元素依次添加到result中 return result #用eval解析输入字符串为真正的列表 listeval(input(请输入列表例如[1,2,3]:)) for p in full_permutation(list): print(p)逻辑解析以列表[1,2,3]为例先选 1 作为第一个元素剩余[2,3]递归求[2,3]的全排列[[2,3],[3,2]]拼接得到[[1,2,3],[1,3,2]]再选 2 作为第一个元素剩余[1,3]递归求全排列后拼接得到[[2,1,3],[2,3,1]]最后选 3 作为第一个元素剩余[1,2]递归求全排列后拼接得到[[3,1,2],[3,2,1]]所有结果合并得到[1,2,3]的 6 种全排列。四、汉诺塔问题递归解决 “分步移动” 类问题汉诺塔是递归的经典应用问题规则为有 A、B、C 三根柱子A 柱有 n 个大小递减的盘子大盘在下、小盘在上每次只能移动 1 个盘子且任何时候大盘不能放在小盘上目标是将 A 柱所有盘子移到 C 柱B 柱作为过渡。递归解决汉诺塔的核心思路边界条件若只有 1 个盘子直接从 A 移到 C递归关系先将 A 柱上 n-1 个盘子从 A 移到 B以 C 为过渡将 A 柱最后 1 个大盘移到 C再将 B 柱上 n-1 个盘子从 B 移到 C以 A 为过渡。代码实现#汉诺塔问题 def hanoi(n,start,mid,end): if n1: #只有一个盘子直接从start移动到end print(start,--,end) #代表从start处移动一个盘子到end处 return #先把把上面的n-1个盘子移动到mid处才能移动最下面的那个最大的盘子注意顺序 hanoi(n-1,start,end,mid) print(start,--,mid) #再把中间的n-1个移动到end进行递归操作 hanoi(n-1,mid,start,end) nint(input()) if __name__ __main__: hanoi(n,A,B,C)逻辑解析以 n2 为例执行过程调用hanoi(1,A,C,B)触发边界条件打印A -- B打印A -- B移动第 2 个盘子调用hanoi(1,B,A,C)触发边界条件打印B -- C最终完成 2 个盘子从 A 到 C 的移动实际输出可结合规则验证步骤合理性。递归算法核心总结递归三要素明确边界条件递归出口避免无限递归、定义递归关系将大问题拆为小问题、确定返回值保证回溯时能正确拼接结果执行逻辑始终遵循 “先递后归”—— 先逐层拆解问题到边界条件再从边界条件开始回溯计算最终得到原问题答案适用场景适合解决具有 “重复子结构” 的问题如阶乘、斐波那契、全排列、汉诺塔但需注意递归深度Python 默认递归深度有限和重复计算问题必要时结合缓存、迭代优化。递归的本质是 “自顶向下” 的问题拆解掌握它不仅能简化代码更能培养 “分而治之” 的编程思维。建议结合上述实例手动推演执行过程理解每一步的 “递” 与 “归”真正吃透递归的核心逻辑。