题目:写一个函数,输入n,求斐波那契数列的第n项F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*)
方式一:使用数组缓存已经得到的结果
//缓存已经得到的数
var Fibonacci = (function() {
var cache = [0, 1];
return function(n) {
var result = cache[n];
if (typeof result != "undefined") {
return result;
} else {
cache[n] = Fibonacci(n - 1) + Fibonacci(n - 2);
return cache[n];
}
}
})();
方式二:普通递归
//这种效率很低
function fi(n) {
if (n <= 0) return 0;
if (n == 1) return 1;
return fi(n - 1) + fi(n - 2);
}
方式三:尾递归方式
//尾递归方式。当一个函数调用另一个函数,一个新的堆栈帧 (stack frame) 被分配用来保存函数的数据状态。无限递归会导致内存问题,因为堆栈帧的分配有一个上限。如果你的调用达到了可分配的上限,它将会导致堆栈溢出。尾递归的思想:让一个递归函数在每一次迭代中复用同一个堆栈,但是它只对递归调用在尾部时有效。一个调用在尾部的意思是函数返回的递归调用结果不再参与任何进一步的计算。
function tailfi(n) {
return (function(n1, n2, i) {
return (i <= n) ? arguments.callee(n2, n1 + n2, i + 1) : n1;
})(0, 1, 1);
}