JS写斐波那契数列的几种方法

方法1 最直观的解题思路.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function fibonacci(n) {
var num1= 1,num2= 1,sum;
for(var i = 3; i <= n; i += 1) {
sum = num1 + num2
num1 = num2
num2 = sum
}
return sum
}
//稍微改进一下以上的方法
function fibonaccii(n){
var num1=1,num2=1,num3;
var arr=[1,1];
for(var i=3;i<=n;i++){
num3=num1+num2;
num1=num2;
num2=num3;
arr.push(num3);
}
return arr;
}

方法2 使用递归的方法, 但是当数字过大时浏览器会出现假死现象。毕竟递归需要堆栈,数字过大内存不够。

1
2
3
4
5
6
7
8
9
10
11
12
13
    function result(n){
if(n==1||n==2){
return 1
};
return result(n-2)+result(n-1);
}
//同样使用递归,只不过使用了三元表达式。
var fib=function(n){
return n<2?n:fib(n-1)+fib(n-2);
};
for(var i=0;i<=10;i+=1){
console.log(fib(i));
}

方法3 使用“记忆”方法减少运算量。在一个数组里保存我们的储存结果,储存结果隐藏在闭包中.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    var fibonaci=function(){
var memo=[0,1];
var fib=function(n){
var result=memo[n];
if(typeof result!=='number'){
result=fib(n-1)+fib(n-2);
};
return result;
};
return fib;
}();
// 我们可以把这种技术推而广之
//编写一个函数来帮助我们构造带记忆功能的函数.
var memoizer=function(memo,formula){
var recur=function(n){
var result=memo[n];
if(typeof result!=='number'){
result=formula(recur,n);
memo[n]=result;
};
return result;
};
return recur;
};
var fib=memoizer([0,1],function(recur,n){
return recur(n-1)+recur(n-2);
})

方法4 使用ES6中的generator

1
2
3
4
5
6
7
8
9
10
11
function* fib(x){
let a=1;
let b=1;
let n=0;
while(n<=x){
yield a;
[a,b]=[b,a+b];
n++;
}
}
console.log(fib(5));
------------- 本文结束 感谢您的阅读-------------

本文标题:JS写斐波那契数列的几种方法

文章作者:一只白~

发布时间:2019年01月06日 - 18:01

最后更新:2019年02月17日 - 13:02

原始链接:http://yoursite.com/2019/01/06/fibonacci/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。