js计算斐波那契数列

 
/**
 * 要求:使用js计算斐波那契数列,时间复杂度尽量低。输入数字n,输出数列内第n位的值
 * 
 * 斐波那契数列如下:
 * 1、2、3、5、8、13、21、34、
 * 
 * 结果验证:
 * 输入8、输出34
 * 输入10、输出89
 * 输入20、输出10946
 */

// 无缓存版本
var calFibonacci = function(n) {
  // 迭代次数统计
  var count = 0;
  function _calFibonacci(n) {
    // 迭代次数统计
    count++;
    if (n === 1) return 1;
    if (n === 2) return 2;

    return _calFibonacci(n-1) + _calFibonacci(n-2);
  }
  var result =  _calFibonacci(n);
  // 输出迭代次数统计
  console.log(count);
  return result;
};

/**
 * 讨论:
 *  递归有什么优点和缺点?
 */


// 缓存版本
var calFibonacci = function(n) {
  var cache = {};
  // 迭代次数统计
  // var count = 0;
  function _calFibonacci(n) {
    // 迭代次数统计
    // count++;
    if (n === 1) return 1;
    if (n === 2) return 2;

    var first;
    if (cache[n-1]) {
      first = cache[n-1];
    } else {
      first = _calFibonacci(n-1);
      cache[n-1] = first;
    }
    
    var second;
    if (cache[n-2]) {
      second = cache[n-2];
    } else {
      second = _calFibonacci(n-2);
      cache[n-2] = second;
    }

    return first + second;
  }
  var result =  _calFibonacci(n);
  // 输出迭代次数统计
  // console.log(count);
  return result;
};

console.log(calFibonacci(20));
posted @ 2019-12-08 15:39  chuanzi  阅读(1025)  评论(0编辑  收藏  举报