9、[问答题]
题目描述
请实现一个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) {
var count = count * 1, //如果为其他类型,则转int型
tailFactorial = function(curr, next, count) {
if (count === 0) {
return curr;
} else {
return tailFactorial(next, curr + next, count - 1); //尾递归采用函数,可有效解决栈溢出问题
}
};
return tailFactorial(1, 1, count);
}
上面为常规写法,下面的写法是利用了ES6 函数参数默认值
function getNthFibonacci(count) {
var count = count * 1, //如果为其他类型,则转int型
tailFactorial = function(count, curr = 1, next = 1) { //ES6函数参数默认值
if (count == 0) {
return curr;
} else {
return tailFactorial(count - 1, next, curr + next); //尾递归采用函数,可有效解决栈溢出问题
}
};
return tailFactorial(count); //直接传count参数
}