Python基础:你的编程第一步
递归
Lesson 7 of 16 • 10 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
递归是一种特殊的编程技巧,函数通过调用自身来解决问题。
刚开始,这个想法可能感觉有点像魔法——或者有点奇怪——但一旦理解了,它就是一个非常强大的工具。
可以把它想象成面对面两面镜子反射。你看到一个倒影中又有倒影,层层叠叠……直到它最终渐渐消失。在递归中,这个“消失”非常关键——我们称之为基本情况,它是停止重复的原因。
递归的工作原理
一个递归函数:
- 检查是否应该停止——这就是基本情况。
- 如果没有停止,它会调用自身,但问题规模变得更小或更简单。
通过不断将问题拆解成更小的部分,递归能达到问题的最简版本,解决它,然后在所有调用返回时重建答案。
示例:阶乘计算
我们以阶乘为例。
在数学中,数字 n 的阶乘(写作 n!)表示:
n! = n × (n-1) × (n-2) × ... × 1
例如:
5! = 5 × 4 × 3 × 2 × 1 = 120
Python 中的递归版本如下:
def factorial(n):
if n == 0: # 基本情况
return 1
return n * factorial(n - 1)
print(factorial(5)) # 120
这里发生了什么:
- 如果
n是 0,我们就达到了基本情况——根据定义,0!等于 1。 - 否则,将
n乘以factorial(n - 1)(同一问题的一个较小版本)。 - 这个过程会一直重复,直到达到基本情况。
为什么使用递归?
递归可以:
- 对于结构自然重复的问题,非常优雅且简洁。
- 适合处理数学问题(阶乘、斐波那契数列)。
- 对于遍历树形结构数据(文件系统、家谱、游戏 AI 搜索)至关重要。
有时递归甚至可以替代循环,虽然它不一定是最高效的选项。
提示:将递归理解为“将问题分解为更小的自身问题,直到可以直接解决”为佳,通常更容易理解。
常见陷阱
重要!:一定要定义一个基本情况——否则函数会无限调用自身,直到 Python 抛出 RecursionError。
排错提示:
- “RecursionError: maximum recursion depth exceeded” → 你没有达到基本情况,或者基本情况定义错误。
- 如果递归感觉对问题来说过于复杂,可以尝试用循环代替。
递归刚开始时可能让人费解,但它只是让代码更智能、更具适应性的一种方式。 当你用几个问题练习过后,你会发现它不仅强大,还能使代码出人意料地简洁优雅。