Fibbonacci序列是一个将数字结果相加后的序列,从1开始。
so.. 1 + 1 = 2
2 + 3 = 5
3 + 5 = 8
5 + 8 = 13
8 + 13 = 21
一旦了解了斐波纳契是什么,我们就可以开始分解代码。
public int fibonacci(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
第一个if语句检查基本情况,在此情况下循环可能会中断。下面的else if语句也做同样的事情,但是可以这样重写:
public int fibonacci(int n) {
if(n < 2)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
现在已经建立了一个基本案例,我们必须了解调用堆栈。您对“ fibonacci”的第一个调用将是最后一个在堆栈上解决的问题(调用顺序),因为它们以与调用相反的顺序进行解析。最后一个调用的方法首先解析,然后在该方法之前调用最后一个,依此类推...
因此,首先进行所有调用,然后再对这些结果进行“计算”。输入为8时,我们期望输出为21(请参见上表)。
一直调用fibonacci(n-1)直到到达基本情况为止,然后调用fibonacci(n-2)直到到达基本情况为止。当堆栈开始以相反顺序对结果求和时,结果将像这样...
1 + 1 = 1 ---- last call of the stack (hits a base case).
2 + 1 = 3 ---- Next level of the stack (resolving backwards).
2 + 3 = 5 ---- Next level of the stack (continuing to resolve).
他们不断冒泡(向后解析),直到正确的总和返回到堆栈中的第一个调用为止,这就是您得到答案的方式。
话虽如此,该算法效率很低,因为它为代码拆分到的每个分支计算相同的结果。更好的方法是“自下而上”的方法,不需要记忆(缓存)或递归(深层调用堆栈)。
像这样
static int BottomUpFib(int current)
{
if (current < 2) return current;
int fib = 1;
int last = 1;
for (int i = 2; i < current; i++)
{
int temp = fib;
fib += last;
last = temp;
}
return fib;
}