首页 > 试题广场 >

请实现一个fibonacci函数,要求其参数和返回值如下所示

[问答题]
请实现一个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) {
}

推荐
此题应该避免使用递归的方法,因为当count较大时,递归的方法耗时较长。
故考虑使用迭代法,可以使用数组记录每一项。
但此题只需要用到前面两项,从节约空间的角度讲不需要开辟数组。
function getNthFibonacci(count) {
    if(count<0) return 0;
    if(count<=1) return 1;
    var first = 1;
    var second = 1;
    var third = 0;
    for(var i = 2; i <= count; i++) {
        third = first + second;
        first = second;
        second = third;
    }
    return third;
}

编辑于 2015-12-02 19:38:54 回复(7)
这道题核心是递归,看大家都能做,不过有些细节可能没考虑到,比如说参数的判断:

function fib(count) {
    //参数判断
    var count = parseInt(count);
    if (isNaN(count) || count < 0) {
        return 0;
    }
    
    function f(count) {
        if (count <= 1)
            return 1;
        return arguments.callee(count - 1) + arguments.callee(count - 2);    //callee是装逼用的,直接用f也行
    }
    return f(count);
}
编辑于 2015-08-18 15:11:20 回复(2)
function getNthFibonacci(count){
    if(count < 2){
        return 1;
    }else{
        return getNthFibonacci(count - 1) + getNthFibonacci(count -2)
    }
}
Fibonacci数列的数学表达式就是:
F(n) = F(n-1) + F(n-2)
F(1) = 1
F(2) = 1
发表于 2015-09-06 16:42:19 回复(2)
function getNthFibonacci(count) {
    if (count <= 1) {
        return 1;
    }
    return getNthFibonacci(count - 1) + getNthFibonacci(count - 2);
}
发表于 2015-08-17 21:36:43 回复(3)
function getNthFibonacci (count) {
      var fibonacci = function (curr,next,count) {
	  if(count == 0){
		return curr;
	   }else{
		return fibonacci(next,curr + next,count-1);
	   }
       };
       return fibonacci(1,1,count);
};

发表于 2015-08-25 17:55:07 回复(2)
function getNthFibonacci(count){
     if(count <= 0) return 0;
     if(count < 2) return 1;
     var pre = 1;
     var cur = 1;
     for(var i = 2; i < count; i++){
       var after = pre + cur;
       pre = cur;
       cur = after;
   }
     return after
}
发表于 2018-04-12 18:41:05 回复(0)
var count = 0; // ***就是一个缓存 var fib = function() { // 使用数组充当缓存 var *** = []; // 注意: 返回的函数才是计算菲波那契数列的函数 return function (n) { count++; // 1 先查看缓存 *** 中有没有n对应的数据 // 如果有,就直接返回 if(***[n] !== undefined) { // 此时,说明缓存中存在 n 对应的数据 return ***[n]; } // 2 缓存中没有n对应的数据, 就先计算结果,然后将计算的结果 // 放到缓存中,然后再返回! // 2.1 如果是0或者1, 此时的值就是1 if(n === 0 || n === 1) { // 直接将固定的值存储到缓存中 ***[n] = 1; // return cahce[n]; return 1; } var tempNum = arguments.callee(n - 1) + arguments.callee(n - 2); // 一定是先放到缓存中,再返回! ***[n] = tempNum; return tempNum; }; }; var fn = fib(); var num = fn(100);
发表于 2017-01-05 01:44:50 回复(0)
functiongetNthFibonacci(count) {
    varfibonacci = [1,1];
    if( count > 1 ){
        for(vari = 1; i < count; i++ ){
            fibonacci.push(fibonacci[fibonacci.length-1]+fibonacci[fibonacci.length-2]);
        }
    }
    returnfibonacci[count];
}

发表于 2016-03-06 02:37:51 回复(0)

function getNthFibonacci(count) {
    var first = 1;
    var second = 1;
    for (var i = 2; i <= count; i++) {
        second += first;
        first = second - first;
    }
    return second;
}

编辑于 2015-08-25 17:22:42 回复(1)
发表于 2023-03-14 23:03:38 回复(0)
function getNthFibonacci(count) {
    if (count == 0 || count == 1) {return 1};
    let n1 = 1;
    let n2 = 1; 
    for (let i = 1; i < count; i++) {
        let temp = n2;
        n2 = n1 + n2;
        n1 = temp;
    }
    return n2;
};
发表于 2021-11-18 17:03:43 回复(0)
function getNthFibonacci(count) {
    var n0=1, n1=1,n=0;
    if (count==0 || count==1){
        return 1;
    }else {
        for (i=1;i<count;i++){
            n=n0+n1;
            n0=n1;
            n1=n;
        }
        return n;
    }
}

发表于 2020-12-30 16:26:52 回复(0)
function getNthFibonacci(count) {
    var [a,b] = [1,1]; //前前者 前者
    var current= 1; 
    for(let i=1;i<count;i++){
        current = a+b;
        [a,b] = [b,current];
    }
    
    return current;
}

发表于 2020-04-03 22:13:39 回复(0)
57头像 57
function fibonacci(count) {
    if (Number == 0) return 1
    if (Number == 1) return 1
    if (Number == 2) return 2
    for (let i = 3; i <= Number; i++) {
        return fibonacci(Number - 1) + fibonacci(Number - 2)
    }
}

发表于 2019-12-04 19:14:03 回复(0)
function getNthFibonacci(count) {
var number = 0;
if(count>1){
number = getNthFibonacci(count-1) + getNthFibonacci(count-2);
}else{
number = 1;
}
return number;
console.log(number);
}
发表于 2019-09-02 11:59:45 回复(0)
function getNthFibonacci(count){     if(count===0||count===1){         return 1;
    }
    var arr = new Array();
    for(var i=0;i<=count;i++){
        if(i===0||i===1){
            arr[i]=1;
        }else{
            arr[i]=arr[i-1]+arr[i-2];
        }
    }
    return arr[count];
}


发表于 2019-08-28 17:24:42 回复(0)

function getNthFibonacci(count) {
    if(count < 2){ //0,1
        return 1;
    }
    var num1 = 1;
    var num2 = 1;
    for(var i = 2 ; i <= count; i++){
        var num3 = num1 + num2;
        if(i===count){
            return num3;
        }else{
            num1 = num2;
            num2 = num3;
        }
    }
}

发表于 2019-06-28 23:55:14 回复(0)
function getNthFibonacci(count) {
    if(count == 0 || count == 1){return 1;}
    var sum=new Array;
    sum[0]=1;
    sum[1]=sum[0]+0;
    for(var i=2;i<=count;i++){
        sum[i]=sum[i-1]+sum[i-2];
    }
    return sum[count];
}
发表于 2019-01-03 10:48:25 回复(0)
两种提供缓存的递归方法      

   1.     function memfac(n){
            if(!memfac.***){
                memfac.***={
                    "0":1,
                    "1":1,
                };
            }
            if(!memfac.***.hasOwnProperty(n)){
                memfac.***[n]=memfac(n-1)+memfac(n-2);
            }
            return memfac.***[n];
        }
        
2.         function mfac(fn,***){
            var a =a||{};
            var shell=function(arg){
                if(!***.hasOwnProperty(arg)){
                    ***[arg]=fn(arg);
                }
                return ***[arg];
            };
            return shell;
        }
      function fibonacci(n){
            if((n==0)||(n==1)){
                return 1;
            }else{
                return fibonacci(n-1)+fibonacci(n-2);
            }
        }
        var text1=mfac(fibonacci,{"0":1,"1":1});
        var fac1=text1(3);
        console.log(fac1);
        console.log(memfac(3));

发表于 2018-10-18 15:47:11 回复(0)
function getNthFibonacci(count) {
   if(count==0||count==1){
    return 1;
   }
   if(count>=2){
      return getNthFibonacci(count-2)+getNthFibonacci(count-1);
   }
}

发表于 2018-09-17 23:54:40 回复(0)
var sum=new Array();
sum[0]=1;
sum[1]=1;
for (i=2;i<=count;i++)
{
      sum[i]=sum[i-1]+sum[i-2];
}
return(sum[count]);
发表于 2018-08-24 10:48:10 回复(0)