2015-09-18 128 views
10

好了,所以这段代码是从我校实践问题。我们要精神分析代码并检查答案。Python函数返回回路

当我第一次解析它时,我得到了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?

+6

重复的http://stackoverflow.com/questions/32653496/python-function-return-loop? – wap26

+0

对于_x_的非负整数值,“foo”是“2到_x_ power”的递归计算。 (如果它将'foo(x-1)'乘以'x'而不是'2',它会计算出“_x_ factorial”)。 –

+1

@ wap26您提供的链接似乎是我的问题 – proxenmity

回答

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 

是否清楚了吗?

+0

@JamesHaskett:这个答案(隐式)显示了一种不使用递归实现相同功能的方法。在递归和不递归的情况下实现'foo'都是一个很好的练习,并比较两种方法。 –

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
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。一旦你明白这一点,你就会理解递归。