/**
* 要求:使用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));