自学javascript一段时间啦,刚开通了自己的csdn博客分享一些自己所学的东西。
接下来是几种使用JS写出斐波那契数列的方法。
方法1 最直观的解题思路.
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 使用递归的方法, 但是当数字过大时浏览器会出现假死现象。毕竟递归需要堆栈,数字过大内存不够。
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 使用“记忆”方法减少运算量。在一个数组里保存我们的储存结果,储存结果隐藏在闭包中.
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
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));