如何可视化Fibonacci递归?

时间:2017-01-27 21:07:53

标签: javascript recursion fibonacci

我总是在努力想象递归,因为它不像迭代循环和for循环那样直接。

很容易忘记递归中发生的事情,因为我们经常使用抽象概念,如值(数字)和变量(x& y)。

如何以避免抽象和使用易于想象的隐喻的方式对Fibonacci系列的递归方法进行可视化?

1 个答案:

答案 0 :(得分:10)

一种流行的递归介绍是通过Fibonacci序列。

Fibonacci背后的基本理念是:

Every number after the first two is the sum of the previous two numbers.

1, 1, 2, 3, 5, 8, 13, 21... to Infinity

我们可以迭代地看待这个问题:

0 + 1 = 1   (1st)
1 + 1 = 2   (2nd)
1 + 2 = 3   (3rd)
2 + 3 = 5   (4th)
...

迭代0& 1,Fibonacci序列的值为1.每次迭代之后,我们只需将前两个值相加,返回2 ... 3 ... 5 ......依此类推。

以下是迭代方法的JavaScript示例:

function fib(n) {

    var prior       = 1,    // sum of previous sequence
        priorprior  = 1,    // sum before previous
        sum         = 1;    // sum of prior + priorprior  

    for (var i = 2; i <= n; i++) {

        // get current fibonacci sequence value 
        sum = prior + priorprior;

        priorprior = prior;
        prior      = sum;
    }

    return sum;
}

递归从最后接近这个问题。

它假设我们有前两个值(2&amp; 3),我们只需要将它们添加到5个。

2 + 3 = 5   (4th)

考虑到这一点,我们可以想象有一个小人住在一个​​盒子里面。

他们的工作很简单:

  • 如果数字为1或更少,只需传回1。

  • 添加前两个数字并将其总和退回。

在这个方框内,还有另外两个方框:一个用于前一个Fibonacci序列。

在每个较小的盒子里面,有更多人在做同样简单的工作。

当我们要求第一个盒子里面的人找到斐波那契序列时,他们会向他们的盒子询问前2个Fibonacci序列,以便他们可以求和。

小盒子内的人也会这样做。

这种递归将发生,直到所要求的Fibonacci序列为1或0时。

那些人只需要传回1.

一旦数字开始传回,人们就可以开始返还他们的金额,一直回到原来的盒子里。

我们的第一个框将简单地将他们收到的2个数字相加并将答案交给我们。

以下是帮助实现此可视化的说明:

Fibonacci recursion

低效的递归JavaScript示例:

function fib(n) {

    if (n <= 1) {
        return 1;
    }

    // return sum of the previous 2 numbers
    return fib(n - 1) + fib(n - 2);
}