斐波那契数列算法问题

斐波那契函数的计算公式

在数学上,费波那契数列是以递归的方法来定义:
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);
        }
      }
posted @ 2015-08-25 17:59  Ryot  阅读(250)  评论(0编辑  收藏  举报