描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。
分析:这个题可以说是迭代(Iteration) VS 递归(Recursion),
f(n) = f(n-1) + f(n-2),第一眼看就是递归啊,简直完美的递归环境,递归肯定很爽,这样想着关键代码两三行就搞定了,然而并没有什么用,测试用例里肯定准备着一个超大的n来让Stack Overflow。因此用递归不可行。可以通过javascript中的尾递归和柯里化方法实现,减少因递归产生的栈溢出的现象。
方法1:用循环迭代:
function Fibonacci(n){
var preNum=1;
var prepreNum=0;
var result=0;
if(n==0){
return 0;
}else if(n==1){
return 1;
}
for(var i=2;i<=n;i++){
result=preNum+prepreNum;
prepreNum=preNum;
preNum=result;
}
return result;
}
方法2:柯里化
function currying(fn, n1, n2) {
return function (m) {
return fn.call(this, m, n1, n2);
};
}
function tailFibonacci(n, ac1, ac2){
if(n==0) { return 0; }
if(n ==1 || n== 2) { return ac2 };
return tailFibonacci (n - 1, ac2, ac1 + ac2);
}
function Fibonacci(n){
return currying(tailFibonacci,1,1)(n);
}
方法2:尾递归
function tailFibonacci(n, ac1, ac2){
if(n==0) { return 0; }
if(n ==1 || n== 2) { return ac2 };
return tailFibonacci (n - 1, ac2, ac1 + ac2);
}
function Fibonacci(n){
return tailFibonacci(n, 1 , 1);
}