斐波那契数列算法问题

斐波那契函数的计算公式

在数学上,费波那契数列是以递归的方法来定义:
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);
        }
      }

转载于:https://www.cnblogs.com/muzizone/p/4757061.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值