有人可以解释一下这个简短的斐波那契序列代码是如何工作的吗?

时间:2019-03-27 20:10:08

标签: python python-3.x recursion

我了解递归,我只是不了解这段代码是如何工作的。我试图通过在每次调用函数时打印参数x来理解。

def fib(x):
  print(x)
  if x == 0 or x == 1:
    return 1
  else: 
    return fib(x-1) +fib(x-2)

print(fib(4))

我得到这些输出:

4
3
2
1
0
1
2
1
0
5

但这对我来说毫无意义。

5 个答案:

答案 0 :(得分:3)

这是递归的执行顺序,蓝色框是函数的每个调用,红色是顺序。请注意,红线是如何按照打印输出的顺序穿过各个框的(从左上方开始,然后向左下方移动)。

enter image description here

答案 1 :(得分:2)

Fibonacci sequence是差分方程

f(x)= f(x-1)+ f(x-2),f(0)= f(1)= 1

if语句询问您的值是否为该系列的“默认”值之一,如果不是,则必须通过递归计算(在else语句中完成)。

关于为什么获得令人困惑的输出的原因是因为函数fib()递归地调用自身,堆叠了每次调用。

在您的示例中,它像这样

fib(4)打印 4 ,然后调用fib(3)和fib(2),首先参加fib(3)

fib(3)打印 3 ,然后调用fib(2)和fib(1),首先参加fib(2)

fib(2)打印 2 ,然后调用fib(1)和fib(0),首先参加fib(1)

fib(1)打印 1 ,然后返回1

现在参加fib(0),打印 0 并返回1

它上升一行并出现在fib(1)上,它打印 1 并返回1

然后它出席fib(2),打印 2 并调用fib(1)和fib(0),fib(1)打印 1 并返回1,fib (0)打印 0 并返回0

您将获得输出。最后一行是答案

答案 2 :(得分:0)

它的答案变量应等于第一+第二。然后,第一名=第二名,第二名=答案。

答案 3 :(得分:0)

也许添加一个深度计数器将有助于解释:

 def fib(x, depth=0):
     print('\t' * depth + str(x))
     if x == 0 or x == 1:
             return 1
     else:
             return fib(x-1, depth+1) + fib(x-2, depth + 1)

print(fib(4))的输出:

4
        3
                2
                        1
                        0
                1
        2
                1
                0
5

答案 4 :(得分:0)

基本上,您所看到的是此输出递归的内部信息,以及用于演示从左到右评估加法的编程语言的演示。如果我们查看每个输出,您可以为MyAppData.Configuration考虑这样的Fibion​​acci算法:

fib(4)

在查看操作时,每当我们到达4 - Call to fib(4) 3 - fib(4)'s call to fib(4-1) 2 - fib(4-1)'s call to fib(4-1-1) 1 - fib(4-1-1)'s call to fib(4-1-1-1): this returns a value of 1 because x = 1 0 - fib(4-1-1)'s call to fib(4-1-1-2): this returns 1 because x = 0; fib(4-1-1) returns 2 because the two 1s are added together 1 - fib(4-1)'s call to fib(4-1-2): this returns a value of 1 because x = 1; the 1 from this is added to the 2 from fib(4-1-1) to make the result for fib(4-1) 2 - fib(4)'s call to fib(4-2) 1 - fib(4-2)'s call to fib(4-2-1): this returns 1 because x = 1 0 - fib(4-2)'s call to fib(4-2-2): this returns 1 because x = 0; fib(4-2) returns 1+1 = 2; fib(4) returns 5 because fib(4-1) returned 3 and fib(4-2) returned 2 5 - Final result 指令时,每次执行return fib(x-1) + fib(x-2)都是因为操作顺序从左到右,就像我们的阅读方式一样。

在计算机级别,它扩展了类似的操作,每一行都越来越深:

fib(x-1)

我已经压缩了一些有关空间的部分,但是它应该能使人们理解这一点。