鱼C论坛

 找回密码
 立即注册
查看: 1846|回复: 2

[已解决]递归的课后练习有疑问

[复制链接]
发表于 2021-4-5 21:54:23 | 显示全部楼层 |阅读模式

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

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

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

大佬们能详解一下第三行是怎么调用的?
2*2,然后y是怎么算上的?
最佳答案
2021-4-5 22:08:49
首先:
执行print(power(2,6))
print函数需要找到power(2,6)的最终返回值,所以进入递归调用

第一次:x=2,y=6,   if y:成立,返回2* power(2,5)  (遇到power函数的调用,进入下一次)
第二次:x=2,y=5,   if y:成立,返回2* power(2,4)  (遇到power函数的调用,进入下一次)
第三次:x=2,y=4,   if y:成立,返回2* power(2,3)  (遇到power函数的调用,进入下一次)
第四次:x=2,y=3,   if y:成立,返回2* power(2,2)  (遇到power函数的调用,进入下一次)
第五次:x=2,y=2,   if y:成立,返回2* power(2,1)  (遇到power函数的调用,进入下一次)
第六次:x=2,y=1,   if y:成立,返回2* power(2,0)  (遇到power函数的调用,进入下一次)
第七次:x=2,y=0,   if y:不成立,返回1  
回到第六层:返回2*1=2
回到第五层:返回2*2=4
回到第四层:返回2*4=8
回到第三层:返回2*8=16
回到第二层:返回2*16=32
回到第一层:返回2*32=64  (最终返回值)

返回给print函数,打印结果为64
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-5 22:08:49 | 显示全部楼层    本楼为最佳答案   
首先:
执行print(power(2,6))
print函数需要找到power(2,6)的最终返回值,所以进入递归调用

第一次:x=2,y=6,   if y:成立,返回2* power(2,5)  (遇到power函数的调用,进入下一次)
第二次:x=2,y=5,   if y:成立,返回2* power(2,4)  (遇到power函数的调用,进入下一次)
第三次:x=2,y=4,   if y:成立,返回2* power(2,3)  (遇到power函数的调用,进入下一次)
第四次:x=2,y=3,   if y:成立,返回2* power(2,2)  (遇到power函数的调用,进入下一次)
第五次:x=2,y=2,   if y:成立,返回2* power(2,1)  (遇到power函数的调用,进入下一次)
第六次:x=2,y=1,   if y:成立,返回2* power(2,0)  (遇到power函数的调用,进入下一次)
第七次:x=2,y=0,   if y:不成立,返回1  
回到第六层:返回2*1=2
回到第五层:返回2*2=4
回到第四层:返回2*4=8
回到第三层:返回2*8=16
回到第二层:返回2*16=32
回到第一层:返回2*32=64  (最终返回值)

返回给print函数,打印结果为64
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-5 22:30:02 | 显示全部楼层
就是 自己调用了自己,比如 power(2, 3)
第一次调用:因为  y 不等于0或false,if y 即 TRUE,所以 执行 返回 2 * power( 2, 3 -1 ) , 即 2 * power(2, 2) 。
  但 power(2, 2) 有等于多少?—— 等于 2 * power(2, 1)
也就是,进行第二调用,返回 2 * power(2, 1)  
同理,
第三次调用,则 返回 2 * power(2, 0)  而 power(2, 0) 就是最后一次调用。这时 y = 0 , 所以 执行 返回 return 1 ,所以,结果 就是 2 * 1 = 2

好,再倒过来,既然 2 * power(2, 0) = 2,    则 2 * power(2, 1) = 2 * 2 = 4,  那 2 * power(2, 2) = 2 * 4 = 8,  
那么
power(2, 3) 第一次调用的 要返回的就是 2 * power(2, 2) , 所以 结果 就是 8 。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 03:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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