斐波那契数列是经典的动态规划问题,用递归很死板,效率也很低.
// 动态规划,将计算过的值进行储存
const fib = function (N) {
// 该方法是递归方法的优化
if (N <= 1) return N;
const arr = [];
arr[0] = 0;
arr[1] = 1;
const memoize = number => {
if (arr[number] !== undefined) return arr[number];
arr[number] = memoize(number - 1) + memoize(number - 2);
return arr[number];
};
const result = memoize(N);
return result;
};
console.log(fib(20));
const fib2 = function (N) {
// 该方法是上一种方法的优化,需要理解上一个方法
if (N <= 1) return N;
const arr = [];
arr[0] = 0;
arr[1] = 1;
for (let i = 2; i <= N; i++) arr[i] = arr[i - 1] + arr[i - 2];
return arr[N];
};
console.log(fib2(20));
const fib3 = function (N) {
// 该方法会丢失之前保存的值,是上一个方法的优化,需要理解上一个方法
if (N <= 1) return N;
// 初始化当前值的前一个值
let pre = 0;
// 初始化当前值
let current = 1;
// 初始化最终结果
let end = 0;
for (let i = 2; i <= N; i++) {
// 最终值等于当前值加当前值的前一个数值
end = pre + current;
// 更新当前值的前一个的值
pre = current;
// 更新当前值
current = end;
}
return end;
};
console.log(fib3(20));