好的,所以这段代码来自我学校的练习题。我们要在心理上解析代码并检查答案。
当我第一次解析它时,我得到4.我复制了代码并通过IDLE运行它得到8.我运行调试器并看到else:return循环if else语句直到x == 0
和然后它返回1.
我不明白返回1是如何出现在8。
def foo(x=5):
if x == 0:
return 1
else:
return 2*foo(x-1)
print(foo(3))
我知道它正在函数foo(x-1)
内调用foo(x=5)
,这使得它一次又一次地检查是否为x == 0
然后它返回1.返回1如何结束打印8 ?
答案 0 :(得分:18)
您将对foo进行以下调用:
foo(3) -> foo(2) -> foo(1) -> foo(0)
那些将返回
foo(0) -> 1
foo(1) -> 2 * foo(0) -> 2 * 1 -> 2
foo(2) -> 2 * foo(1) -> 2 * 2 -> 4
foo(3) -> 2 * foo(2) -> 2 * 4 -> 8
现在是否清楚?
答案 1 :(得分:11)
我认为你有正确的想法(否则你不会得到答案4),你只是在心理锻炼中过早堕胎。
您可以在浏览代码时通过列表来跟踪变量:
foo(3)
foo(3 - 1)
→foo(2)
foo(2 - 1)
→foo(1)
foo(1 - 1)
→foo(0)
1
2 * foo(1 - 1)
→2
2 * foo(2 - 1)
→4
2 * foo(3 - 1)
→8
答案 2 :(得分:4)
递归与您最初期望的相反。它不是以x = 3开头,而是跟随所有递归调用,x的第一个值实际上是0。
以下是您脚本的修改版本,其中说明了如何运行步骤以及它如何到达8的顺序。
def foo(x=5):
if x == 0:
r = 1
print (x, r)
return r
else:
r = 2*foo(x-1)
print (x, r)
return r
print(foo(3))
注意打印的x的第一个值是1而不是你给它的3。一旦你理解了这一点,你就会理解递归。