鱼C论坛

 找回密码
 立即注册
查看: 1454|回复: 18

[已解决]python 22课 关于 递归 函数 问题 求指引走出盲区

[复制链接]
发表于 2018-2-17 14:55:28 | 显示全部楼层 |阅读模式

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

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

x
def power(x, y):
    if y:
        return x * power(x, y-1)
    else:
        return 1
    
print(power(2, 3))

用递归的形式 写出 x的 y 次幂

return x * power(x, y-1)  这句  第一次 return之后 x * power(2,3-1) ==  x * power(2, 2) 这里看明白了  函数 的变量 y 发生了变化 power(2, 2)
那 下面打印结果 怎么回事 函数变了  打印结果 怎么出现两个  x 相乘了   if y==2的时候

if y == 3                return x * power(x, y-1) == return 2 * power(2, 3-1) == reteurn 2 * power(2, 2)
if y == 2                return x * power(x, y-1) == return 2 * 2 * power(2, 2-1) == return 2 * 2 * power(2, 1) # 这里不懂 红色部分  怎么 就多出来一个  x  打印函数的时候 就函数的参数变了 怎么 函数power()  前面的 x 也跟着函数走了  又重新调用一次呢
if y == 1                return x * power(x, y-1) == return 2 * 2 * 2 * power(2, 1-1) == return 2 * 2 * 2 * power(2, 0)
if y == 0                else                return 1 #请问这里打印 1  是什么意思  这个  1 用到那里去了  用了还是么有用?
最佳答案
2018-2-17 16:51:00
小甲鱼的书你不是有吗?看一下斐波那契数列那章就明白了。这里并不是单纯的y每次-1啊,是每次return了上次调用自己的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-17 15:49:45 | 显示全部楼层
x*power(x,y-1)可以理解成这样:
因为 power(x,y-1)=x*power(x,y-2),且当power(x,y-n)的第二个参数为0时函数的返回值为1,所以如果power(2,3)就是,
x*power(x,y-1)=x*x*power(x,y-2)=x*x*x*power(x,y-3)算到y-3时进入else就是power(x,0)=1,函数结束返回所有之前的值,对应下面的数字:
2*2*2*1
重在参与!答错了别怪我!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-17 16:51:00 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
小甲鱼的书你不是有吗?看一下斐波那契数列那章就明白了。这里并不是单纯的y每次-1啊,是每次return了上次调用自己的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-17 16:52:32 | 显示全部楼层
breakout 发表于 2018-2-17 15:49
x*power(x,y-1)可以理解成这样:
因为 power(x,y-1)=x*power(x,y-2),且当power(x,y-n)的第二个参数为0时函 ...

嗯 嗯 谢谢
新年快乐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-17 17:15:18 | 显示全部楼层
大头目 发表于 2018-2-17 16:51
小甲鱼的书你不是有吗?看一下斐波那契数列那章就明白了。这里并不是单纯的y每次-1啊,是每次return了上次 ...

主要看了  没捞到干货
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-17 20:01:57 | 显示全部楼层
在if判断语句里面,如果判断值为0,则返回为false,所以进入else,运行return 1, 于是此时的返回值为1,以1为起点,一层层的返回上去了,就计算了x的y次幂。(所以return 一个确定的值,比如这里的1,其实是递归的终点,运算的起点。)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-17 20:35:07 | 显示全部楼层
所向故往 发表于 2018-2-17 20:01
在if判断语句里面,如果判断值为0,则返回为false,所以进入else,运行return 1, 于是此时的返回值为1,以1 ...

好吧 谢谢 这东西号深奥 我理解理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-17 22:05:24 | 显示全部楼层
return 2*power(2, 2) ----> return 2*2*power(2, 1) ----> return 2*2*2*power(2, 0) ----> return 2*2*2*1 即所需的2的三次方了
2*power(2, 2)  他是递归
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-17 22:11:34 | 显示全部楼层
breakout 发表于 2018-2-17 15:49
x*power(x,y-1)可以理解成这样:
因为 power(x,y-1)=x*power(x,y-2),且当power(x,y-n)的第二个参数为0时函 ...

你好
这里 x * power(x, y -1)--->为啥递归之后就变成 x * power(x, y- 2) 了
为什么 会变成 y -2,  y -2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-17 23:09:27 | 显示全部楼层
当计算POWER(2,3)的时候,程序应该是这样首先=2*POWER(2,2),这时并没有计算,只是先把这个表达式存着起来,因为不知道POWER(2,2)到底等于什么实际的值(数),但它知道POWER(2,2)=2*POWER(2,1),这样,因为还是不知道POWER(2,1)等于什么,所以还得继续存着,两个加起来就应该是:2*2*POWER(2,1)   同样程序虽然不知道POWER(2,1)等于几但它还是知道它=2*POWER(2,0),那存着东西就变成了2*2*2*POWER(2,0),到这里程序就知道POWER(2,0)等于什么了,因为POWER(X,Y)的第二个参数Y=0时程序会到ELSE里找到答案是1,就是小甲鱼老师在视频里说的把复杂问题简化到最最简单程度的意思,这样程序已经没未知的东西了,2*2*2*1一层一层的归回去=8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-17 23:10:49 | 显示全部楼层
我也是0基础,所以全是大白话!不对的地方请大咖们纠正!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-18 21:26:07 | 显示全部楼层
breakout 发表于 2018-2-17 15:49
x*power(x,y-1)可以理解成这样:
因为 power(x,y-1)=x*power(x,y-2),且当power(x,y-n)的第二个参数为0时函 ...

今天又研究 递归 一天 似乎明白了 看了几遍视频和书  。。。。。
返回来又来看 我自己的提问 谢谢啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-18 21:29:32 | 显示全部楼层
所向故往 发表于 2018-2-17 20:01
在if判断语句里面,如果判断值为0,则返回为false,所以进入else,运行return 1, 于是此时的返回值为1,以1 ...

终点 也是起点  是这么理解的么
if y==0 的时候 执行return 1  终点
起点 一层一层 调用函数的过程 从最后再往上推回去, x 的值乘回去

今天又研究 递归 一天 似乎明白了 看了几遍视频和书  。。。。。
返回来又来看 我自己的提问 谢谢啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-18 21:39:16 | 显示全部楼层
breakout 发表于 2018-2-17 23:09
当计算POWER(2,3)的时候,程序应该是这样首先=2*POWER(2,2),这时并没有计算,只是先把这个表达式存着起来 ...

你好
刚刚 又看了一遍  你这个解释 很经典 只是我昨天没有看懂
今天又看看  感觉好多了
非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-18 22:19:08 | 显示全部楼层
还以为我白干了呢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-18 22:22:32 | 显示全部楼层
另外递归函数的最后返回值,应该是总返回值,就是之前的所以IF后的RETURN(S)+最后在ELSE后的RETURN,和普通函数不太一样,它是把所有RETURN值都暂时存起来,等着最后那个来了再一起返回!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-18 22:25:41 | 显示全部楼层
breakout 发表于 2018-2-18 22:22
另外递归函数的最后返回值,应该是总返回值,就是之前的所以IF后的RETURN(S)+最后在ELSE后的RETURN,和普 ...

哦了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-18 22:26:18 | 显示全部楼层
breakout 发表于 2018-2-18 22:22
另外递归函数的最后返回值,应该是总返回值,就是之前的所以IF后的RETURN(S)+最后在ELSE后的RETURN,和普 ...

还不敢说 百分之百的懂 再领悟领悟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-18 22:31:53 | 显示全部楼层
这次用RETURN的说法其实和上次写了一大堆说的是一个意思,只是相对抽象一些,不到抽象思维想搞透逻辑有点难!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 01:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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