获得第n个Fibonacci的递归方法正在发生什么

时间:2017-04-21 15:12:19

标签: java recursion

以下是获取nth Fibonacci数的递归方法。

  static int getNthFib(int n) {
    if (n < 2) return 1;
    return getNthFib(n - 2) + getNthFib(n - 1);
  }

如果我传过5,它将返回5,即Fibonacci序列中的第五个元素。

0 1 1 2 3 5

enter image description here

但是当我试图理解这个递归调用中实际发生了什么并抽出每个方法调用时,我希望它返回8.下面的图表是不是方法调用堆栈,如果是为什么不是回答13?

注意

我编辑了图像,原来是错的。但是,如果我将这个数字的所有数字加起来,答案就会出现8.尽管实现不正确,为什么它会返回5而不是8?

2 个答案:

答案 0 :(得分:5)

你的左子树是错误的,F(3)应该分支到F(2)和F(1)。 enter image description here

Morever F(0)应该为零而不是1,因为如果没有元素,sum应该返回为零。(修改基本情况)

正如评论中所建议的,并根据您的新问题如果您需要找到斐波纳契系列。尝试使用以下代码绘制树,它应该给你正确的结果。

static int getNthFib(int n) {
    //change the return statement to return n, rather than return 0.
    if (n < 2) **return n**;
    return getNthFib(n - 2) + getNthFib(n - 1);
}

答案 1 :(得分:0)

如果我们查看Fibonacci numbers的定义,我们有:

F(0)= 0

F(1)= 1

F(n)= F(n-1)+ F(n-2),每n> = 2

因此,对于基本情况,我们应该写这样的东西:

import atexit
import datetime

def hello():
    print "hello, world"

def saveDateTime():
    now = datetime.datetime.now()
    ## create log
    with open("logs.txt", "a") as log:
        log.write(str(now) + "\n")

def goodbye():
    try:
        _dates = open("logs.txt").read()
        _count = len(_dates)
    except IOError:
        _count = 0
    print 'Goodbye, this script has been run %d times.' % (_count)

if __name__ == "__main__":
    hello() ## run hello
    atexit.register(saveDateTime) ## then log when you used this
    atexit.register(goodbye) ## then log when you used this

至于图表,我看到两个问题:

  • 左子树将F(3)扩展为F(3)+ F(4)(参见TheManHasNoName的答案)
  • F(0)应为0,而不是1

根据我刚才写的代码。

if (n = 0) return 0;
if (n = 1) return 1;