爱吃肥肉的马 发表于 2021-4-5 21:54:23

递归的课后练习有疑问

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

阿奇_o 发表于 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 。

页: [1]
查看完整版本: 递归的课后练习有疑问