博客一:从“重复做一件事”开始,读懂递归的本质

张开发
2026/4/21 9:52:09 15 分钟阅读

分享文章

博客一:从“重复做一件事”开始,读懂递归的本质
大家好今天我们来聊一个编程里既“神奇”又“让人头疼”的概念——递归。很多新手朋友第一次接触递归都会被它“自己调用自己”的逻辑绕晕甚至觉得“这东西明明可以用循环解决为什么非要搞这么复杂”。其实递归的核心远不止“自调用”它背后藏着一种极简的解题思维今天我们就用最通俗的方式把递归扒明白。先给递归一个最直白的定义递归就是函数在执行过程中调用自身来解决规模更小的同类问题直到遇到“终止条件”后逐步返回结果最终完成整个问题的求解。简单说就是“大事化小小事化了”——把一个复杂的大问题拆解成和它本质一样、但难度更低的小问题直到小问题简单到可以直接给出答案再反向拼凑出大问题的解。我们先举一个生活中最常见的例子帮大家建立直觉假设你在排队想知道自己排在第几位但前面人很多你看不到队首。这时候你可以问前面的人“你排在第几位”前面的人也不知道就会接着问他前面的人直到问到队首的人——队首的人知道自己是第1位然后把答案告诉后面的人后面的人再加1依次传递回来你就知道自己的位置了。这个过程就是递归的核心逻辑终止条件队首的人知道自己是第1位不用再问别人递归步骤每个人都问前面的人“你排第几”调用自身的同类操作返回过程前面的人把结果返回自己再加1逐步拼凑答案。对应到编程中递归函数必须满足两个核心条件缺一不可否则会陷入“无限递归”就像两个人一直互相问“你排第几”没人知道终止最终程序崩溃1. 终止条件base case递归必须有一个“出口”当问题规模小到一定程度时直接返回结果不再调用自身2. 递归关系recursive case将当前问题拆解成规模更小、逻辑一致的子问题通过调用自身解决子问题再组合子问题的结果得到当前问题的解。我们用一个最简单的编程案例——计算n的阶乘n! n × (n-1) × (n-2) × ... × 1来看看递归是如何实现的。首先拆解问题n的阶乘 n × (n-1)的阶乘而(n-1)的阶乘 (n-1) × (n-2)的阶乘以此类推直到1的阶乘 1终止条件。用Python代码实现如下def factorial(n): # 终止条件1的阶乘是1 if n 1: return 1 # 递归关系n! n * (n-1)! return n * factorial(n-1) # 测试 print(factorial(5)) # 输出120我们拆解一下factorial(5)的执行过程就能看清递归的“调用-返回”链路factorial(5) → 5 × factorial(4)factorial(4) → 4 × factorial(3)factorial(3) → 3 × factorial(2)factorial(2) → 2 × factorial(1)factorial(1) → 1终止开始返回然后反向计算2×12 → 3×26 → 4×624 → 5×24120最终得到结果。看到这里可能有朋友会问“用循环也能计算阶乘为什么要用递归”。其实递归的优势不在于“高效”反而递归会有函数调用的开销效率通常不如循环而在于“简洁”——对于一些具有“自相似”结构的问题比如树的遍历、斐波那契数列、汉诺塔用递归写的代码会异常简洁逻辑也更清晰让人一眼就能看懂解题思路。最后给新手朋友一个小提醒写递归时先想清楚“终止条件”再梳理“递归关系”不要一开始就陷入“调用自身”的细节里。就像解决排队问题先确定“队首是第1位”这个终止条件再想“每个人问前面的人”这个递归步骤问题就会简单很多。下一篇博客我们会聊一聊递归的实战技巧以及如何避免递归的常见坑比如栈溢出感兴趣的朋友可以持续关注

更多文章