这项计划中的“返回斐波纳契......”是怎么回事?

时间:2012-06-24 20:41:59

标签: python recursion fibonacci

我无法理解return fibonacci( number-1 ) + fibonacci( number-2 )在以下程序中的作用:

import sys
def fibonacci( number ):
    if( number <= 2  ):
        return 1
    else:
        return fibonacci( number-1 ) + fibonacci( number-2 )

问题在于我无法想象这条线是如何工作的:

return fibonacci( number-1 ) + fibonacci( number-2 )

“fibonacci(number-1)”和“fibonacci(number-2)”是否同时处理?或者“斐波那契(数字-1)”是第一个被处理的,然后是第二个?

我只看到处理他们两个最终会返回'1'所以最后的结果我希望看到它是'1 + 1'='2'

如果有人能够详细解释其计算过程,我将非常感激。

我认为这是一个非常新的问题,但我无法真正了解其过程。

4 个答案:

答案 0 :(得分:5)

你为什么不这样做:

>>> def fibonacci(number):
...     if number < 2:
...         return number
...     print "Number is currently %d, getting fibonacci(%d)" % (number, number - 1)
...     minus_one = fibonacci(number-1)
...     print "Number is currently %d, just got fibonacci(%d), now getting fibonacci(%d)" % (number, number - 1, number - 2)
...     minus_two = fibonacci(number-2)
...     print "Number is currently %d, returning %d + %d" % (number, minus_one, minus_two)
...     return minus_one + minus_two

因此,当您致电fibonacci时,您会得到以下内容:

>>> fibonacci(4)
Number is currently 4, getting fibonacci(3)
Number is currently 3, getting fibonacci(2)
Number is currently 2, getting fibonacci(1)
Number is currently 2, just got fibonacci(1), now getting fibonacci(0)
Number is currently 2, returning 1 + 0
Number is currently 3, just got fibonacci(2), now getting fibonacci(1)
Number is currently 3, returning 1 + 1
Number is currently 4, just got fibonacci(3), now getting fibonacci(2)
Number is currently 2, getting fibonacci(1)
Number is currently 2, just got fibonacci(1), now getting fibonacci(0)
Number is currently 2, returning 1 + 0
Number is currently 4, returning 2 + 1
3

它仍然很复杂,但至少现在你可以看到函数正在做什么来计算你的数字。

答案 1 :(得分:3)

  

“fibonacci(number-1)”和“fibonacci(number-2)”是否同时处理?或者“斐波那契(数字-1)”是第一个被处理的,然后是第二个?

重要吗?


发生的事情是该函数被调用两次。一次使用number -1和-2的值,将number的值传递给函数的当前“实例”。

说你打电话给fibonacci(3)。这条线最终会成为:

return fibonacci(2) + fibonacci(1)

答案 2 :(得分:2)

我非常喜欢Nolen Royalty的答案,但仍然有点难以想象。经过一段时间的讨论之后: enter image description here

...时间从左到右流动,稍微调整以防止一些重叠的边缘。不递归的叶节点是橙色的。

答案 3 :(得分:2)

我最初理解递归时遇到了一些麻烦,所以我会尝试通过这个函数。

现在我们假设你打电话给斐波那契(4)

由于数字越大,2 python将转到此行:

返回fibonacci(数字-1)+斐波那契(数字-2)

因此它将开始评估并致电:

斐波那契(3)#这是斐波那契(4-1)

因为每次遇到函数调用时都必须运行它(所以说)。

所以现在它会尝试做fibonacci(3),因为它大于2:

它会再次出现在这一行:

返回fibonacci(数字-1)+斐波那契(数字-2)

现在它用3来调用它所以当它到达斐波纳契(数字-1)时它会这样做:

斐波那契(2)#这是斐波那契(3 - 1)

由于数字等于2,这个递归调用将返回1.现在你必须记住/想象python知道斐波那契(2)的答案就这么说。

所以现在它有一个斐波那契(2)的答案,它将继续执行这一行:

返回fibonacci(数字-1)+斐波那契(数字-2)

具体来说:+斐波那契(数字-2)

记住我们站在斐波纳契(2)所以这将做斐波那契(1),这将返回1.

所以现在当我们返回时,我们开始重新开始,所以说,我们递归地退出函数。

问题是什么?当我们做斐波那契(4)时,我们需要知道斐波纳契(3),斐波那契(2),斐波那契(1),现在我们知道了。

因此,当它以递归方式向斐波那契(3)输出时,它需要知道斐波纳契(2)和斐波那契(1),它知道,所以现在我们现在为斐波那契(3)。

现在我们回到斐波纳契(4),我们需要知道斐波那契(3)和斐波那契(2),我们都知道它们将返回什么,两者的总和。

我希望很清楚,递归很难遵循,但练习会变得更好。

尝试通过以下方式调用函数调用(用铅笔)来调用您正在调用的调用,以及从调用中获得的结果。

请记住,在这种递归中,你会在递归“寻找答案”的水平上下来,当你得到那些答案(返回)时,你会再次回到原点,给出未知值的答案。