鱼C论坛

 找回密码
 立即注册
查看: 574|回复: 16

[已解决]22讲,递归

[复制链接]
发表于 2020-4-1 18:35:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)


如果n = 5
为什么if n == 1:不是一直循环吗?最后结果不是等于1吗?为什么最后返回的是return n*factorial(n-1)的n
        return 1
最佳答案
2020-4-2 17:17:29
n = 5 --> return 5 * factorial(4)
n = 4 --> return 4 * factorial(3)
n = 3 --> return 3 * factorial(2)
n = 2 --> return 2 * factorial(1)
n = 1 --> return 1   #此处的值1是返回给上一层的factorial(1)的,然后上一层的值变成2 * 1返回给再上一层factorial(2),这样一层一层返回到最上面就变成return 5*4*3*2*1,那就是120啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-1 18:37:16 From FishC Mobile | 显示全部楼层
return 意味着这个函数这一次的执行告一段落
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 18:38:32 From FishC Mobile | 显示全部楼层
不,不是你想的这样,它是将每次执行函数的返回值再次作为函数的参数,进行计算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 18:41:19 From FishC Mobile | 显示全部楼层
本帖最后由 _2_ 于 2020-4-1 18:43 编辑

factoral(2) 就会返回 2 × factoral(1),由于第二次执行时 n == 1,
所以最终返回的就是2 × 1 = 2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 18:50:16 | 显示全部楼层
你这个函数计算的是5的阶乘,因为if是判断语句,不是循环语句,更不是赋值,输入n=5之后,if语句判断5不等于1,所以执行else
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 18:58:21 | 显示全部楼层
return 只是返回当前函数,并不是返回整个递归。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 07:54:04 | 显示全部楼层
_2_ 发表于 2020-4-1 18:41
factoral(2) 就会返回 2 × factoral(1),由于第二次执行时 n == 1,
所以最终返回的就是2 × 1 = 2

为什么第二次执行时 n == 1就会停下来然后返回2*1=2
不能返回1吗?它不是n == 1时就返回1吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 07:59:19 | 显示全部楼层
zltzlt 发表于 2020-4-1 18:58
return 只是返回当前函数,并不是返回整个递归。

那if n == 1: 时它不是return 1不是已经返回1了吗?不应该最后返回的是1
为什么反而是return n * factorial(a-1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 08:00:07 | 显示全部楼层
-Francis. 发表于 2020-4-2 07:59
那if n == 1: 时它不是return 1不是已经返回1了吗?不应该最后返回的是1
为什么反而是return n * factor ...

只是返回一层递归。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 08:02:45 | 显示全部楼层
zltzlt 发表于 2020-4-1 18:58
return 只是返回当前函数,并不是返回整个递归。

它不用返回1吗?
返回1不应该n=1吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 08:03:41 | 显示全部楼层
-Francis. 发表于 2020-4-2 08:02
它不用返回1吗?
返回1不应该n=1吗?

返回 1 只是返回一层,在函数中多次调用了自身
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 08:24:58 | 显示全部楼层
zltzlt 发表于 2020-4-2 08:03
返回 1 只是返回一层,在函数中多次调用了自身

如果n==2时不应该是在返回return n * factorial(n-1)后
n == 1:再返回return 1吗?


返回1只是一层什么意思??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 08:54:25 From FishC Mobile | 显示全部楼层
-Francis. 发表于 2020-4-2 07:59
那if n == 1: 时它不是return 1不是已经返回1了吗?不应该最后返回的是1
为什么反而是return n * factor ...

它会把另一个函数的返回值相乘再返回,这是一个回溯的过程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 09:13:17 | 显示全部楼层
_2_ 发表于 2020-4-2 08:54
它会把另一个函数的返回值相乘再返回,这是一个回溯的过程

if n == 1:只能return 1吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 09:40:17 | 显示全部楼层
-Francis. 发表于 2020-4-2 09:13
if n == 1:只能return 1吗?

你愿意return几就return几
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 11:34:13 | 显示全部楼层
def factorial(n):  # 定义一个函数,可以接受一个参数,看你函数的运算,参数只能是int类型
    if n == 1: #  条件判断,如果n为1
        return 1 #  返回一个int 1
    else:  #  如果n不为1
        return n * factorial(n-1)  #  递归运算

你举得例子:
- 如果n为5,参数传入后,条件判断n不为1
- 执行else后的语句,
- 递归传入n-1,也就是4
······················
- 递归直到传入的参数为1,返回1,结束
- 实际上就是5*4*3*2*1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 17:17:29 | 显示全部楼层    本楼为最佳答案   
n = 5 --> return 5 * factorial(4)
n = 4 --> return 4 * factorial(3)
n = 3 --> return 3 * factorial(2)
n = 2 --> return 2 * factorial(1)
n = 1 --> return 1   #此处的值1是返回给上一层的factorial(1)的,然后上一层的值变成2 * 1返回给再上一层factorial(2),这样一层一层返回到最上面就变成return 5*4*3*2*1,那就是120啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 21:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表