我总是在努力想象递归,因为它不像迭代循环和for循环那样直接。
很容易忘记递归中发生的事情,因为我们经常使用抽象概念,如值(数字)和变量(x& y)。
如何以避免抽象和使用易于想象的隐喻的方式对Fibonacci系列的递归方法进行可视化?
答案 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个数字相加并将答案交给我们。
以下是帮助实现此可视化的说明:
低效的递归JavaScript示例:
function fib(n) {
if (n <= 1) {
return 1;
}
// return sum of the previous 2 numbers
return fib(n - 1) + fib(n - 2);
}