1、第一次尝试最简单的递归调用,排除掉n=0,1的特殊情况,剩下的情况根据f(n)=f(n-1)+f(n-2)递归调用。虽然语法正确,但是当n较大时很快产生栈溢出
function Fibonacci(n){
if(n == 0){
return 0;
}else{
return n > 1 ? Fibonacci(n-1)+Fibonacci(n-2):1;
}
}
2、循环版
发现每次计算只需用到最近的两个值,所以借助三个变量分别存储结果,前一个值和后一个值。每执行一次循环,将当前结果作为下一次计算的前一个值,将当前结果的前一个值作为下次计算结果的前两个值。
function Fibonacci(n){
if(n == 0){
return 0;}else if(n ==1){
return 1;}else{
var c = 0, a = 0,b =1;
for(var i =2;i <= n;i++){
c = a + b;
a = b;
b = c;
}
return c;
}
}
循环简化版1
可以简化为两个变量保存到数组中进行读取和赋值
function Fibonacci(n){
if(n===0){
return 0;}
if(n===1){
return 1;}
var a=0,b=1;
for(var i = 2;i<=n;i++){
[a,b]=[b,a+b];}
return b;
}
循环简化版2
定义最初的两个值,将相加结果保存到第二个变量,同时又作为下次计算的第二个变量,那么下次计算的第一个变量为当前结果减去上次计算的第一个变量
function Fibonacci(n){
if(n===0){return 0;}
if(n===1){return 1;}
var a=0,b=1;
for(var i = 2;i<=n;i++){
b = b + a;
a = b - a; }
return b;
}