首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >python递归基础

python递归基础

作者头像
小田测测看
发布2026-06-17 17:22:48
发布2026-06-17 17:22:48
780
举报

学习递归前,需先理解函数的工作机制,递归概念适用于所有编程语言。

什么是递归? 多数编程语言中,函数可调用其他函数,而递归是函数调用自身的技术。

例:

代码语言:javascript
复制
def   call_me():    

   call_me() 

这里函数自我调用,即递归。 但“自我调用”只是递归的程序定义。递归的核心是将问题分解为更小部分,直至无法再分,通过解决小问题并组合结果来解决整个问题。

用生活例子类比递归 想象你在上海迪士尼乐园排队,想知道队伍总人数。你可以问前面的人:“你前面有多少人?” 对方若也不知道,会用同样的方式问更前面的人,直到有人前面没人(即第一个人),他会回答“0”。接着后面的人依次加1回复,最后你就能知道总人数——这就是递归的思路:通过层层拆解问题,从最基础的情况(终止条件)反向推导答案。

Image
Image

队伍中的每个人代表同一问题的一个较小实例:确定前面的人数。通过解决这些较小的实例并结合它们的结果,整个问题得到了解决。这正是递归的工作原理。

递归的简单例子

计算阶乘是递归的最简单例子,它将真正帮助你理解其工作原理。

有很多方法可以计算一个数的阶乘。但在这里,我们将看到递归的方式来找到它。

在思考我们如何做到这一点之前,我们需要知道一个数的阶乘是什么。

一个数的阶乘是从 1 到该数的所有数字的乘积。

例如,5 的阶乘是 120 —— 即 5×4×3×2×1

我们还可以用数学方式表示如下:

代码语言:javascript
复制
5×(5−1)!

这意味着如果我们知道 (5−1)! 的值,我们就可以通过简单地将 5 乘以它来轻松得到阶乘。

这就是我们如何找到 43210 的阶乘:

代码语言:javascript
复制
Factorial of 4 = 4×(4−1)!
Factorial of 3 = 3×(3−1)!
Factorial of 2 = 2×(2−1)!
Factorial of 1 = 1
Factorial of 0 = 1

通过观察这些,很明显要找到 5 的阶乘,我们必须将 5 乘以 4!

更普遍的例子

要找到 n 的阶乘,我们需要将 n 乘以 (n−1)!。这就是你需要递归执行的过程。

现在,必须为递归设置一个停止条件。停止条件是我们不再执行其他操作的地方。当 n10 时,我们可以简单地停止递归,因为这些值的阶乘是已知的。我们可以简单地说 1 的阶乘是 1,对于 0 也是如此。

因此,分解下来,要找到 n 的阶乘,所需做的最小工作量是 n×(n−1)!。当我们找到 10 的阶乘时,我们可以停止对它进行操作。

让我们看看代码是怎样的:

代码语言:javascript
复制
# 计算 n 的阶乘
def fact(n):
      # 最少工作量
     return n * fact(n - 1)

n = 5

# 计算阶乘
factorial = fact(n)
print(factorial)

输出:

代码语言:javascript
复制
120

让我们看看它是如何工作的:

在第一次函数调用中,计算了 5 的阶乘。接着在第二次调用中,计算了 4 的阶乘,以此类推,直到计算 2 的阶乘。

图像
图像

递归计算 5 的阶乘

在调用 2 的阶乘时,我们有2×fact(2−1),即2×fact(1)

这达到了我们的基本条件。因此,递归停止,2×fact(1)返回2×1给前一个函数调用,并且结果从堆栈中弹出。

图像
图像

第四次函数调用返回 2 给前一个函数调用并从堆栈中弹出

类似地,这里是其他内容的计算方式:

图像
图像

第三次函数调用返回 6 给前一个函数调用并从堆栈中弹出

图像
图像

第二次函数调用返回 24 给前一个函数调用并从堆栈中弹出

图像
图像

第一次函数调用返回 120 给初始函数调用并从堆栈中弹出

所以函数最终将值 120 返回给初始函数调用。

总结

这只是递归的入门介绍

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程拾光 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 递归的简单例子
    • 更普遍的例子
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档