我了解递归,我只是不了解这段代码是如何工作的。我试图通过在每次调用函数时打印参数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
但这对我来说毫无意义。
答案 0 :(得分:3)
答案 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
考虑这样的Fibionacci算法:
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)
我已经压缩了一些有关空间的部分,但是它应该能使人们理解这一点。