斐波那契数列算法问题
斐波那契函数的计算公式
在数学上,费波那契数列是以递归的方法来定义:
F_0=0
F_1=1
F_n = F_{n-1}+ F_{n-2}(n≧2)
偶然间看到阿里的一个关于斐波那契数列的一个算法问题如下
请实现一个fibonacci函数,要求其参数和返回值如下所示:
/**
*@desc: fibonacci
*@param: count {Number}
*@return: result {Number} 第count个fibonacci值,计数从0开始
fibonacci数列为:[1, 1, 2, 3, 5, 8, 13, 21, 34 …]
则getNthFibonacci(0)返回值为1
则getNthFibonacci(4)返回值为5
*/
function getNthFibonacci(count) {
}
给出参考答案是:
function getNthFibonacci(count) {
if (count <= 1) {
return 1;
}
return getNthFibonacci(count - 1) + getNthFibonacci(count - 2);
}
但是我用该方法测试后,发现当输入100,我的浏览器就崩溃了(ps : 我的笔记本是 i7 8G内存);递归性能消耗太大,如果说笔试空白较少或者考验递归使用,这样写是最好的。如果空白比较多,或者考虑性能测试等条件的话可以借鉴下面的算法。
下面是我的做法以及别人的做法。。。
(一)
function getNthFibonacci (n) {
var fibonacci = function (curr,next,n) {
if(n == 0){
return curr;
}else{
return fibonacci(next,curr + next,n-1);
}
};
return fibonacci(1,1,n);
};
(二)
function getNthFibonacci (n) {
var fibs = [1,1];
if (n >=2 ) {
for (var i = 2; i <= n; i++) {
fibs[i] = (fibs[i-1] + fibs[i-2]);
};
return fibs[n];
}else{
return fibs[n];
}
}
其他人的解法:
(一)
function getNthFibonacci (n) {
if(n<=2) return 1;
var first = 0;
var second = 1;
var third = 1;
for(var i = 0; i < n; i++) {
third = first + second;
first = second;
second = third;
}
return third;
}
(二)
function getNthFibonacci(n) {
var x = parseInt(n);
if(isNaN(x) || x <= 0) {
return 0;
} else if(x == 1) {
return 1;
} else {
return arguments.callee(x - 1) + arguments.callee(x - 2);
}
}