1. 什么是动态规划
动态规划是解决多阶段决策过程最优化的一种有效的数学方法。
// 递归Recursion 存储数据(Memoization)
// 非常适合重复计算 通过存储数据避免不必要的递归步骤
// 可能导致重复工作 中间结果被存储并重复使用
// --------------动态规划----------
// 动态规划是一种解决问题的思路、思维,而不是一种具体方法
优化前的代码
具体结果看:11-algorithm指数时间复杂度-递归斐波那契数列&指数VS平方时间复杂度
let count = 0; // 执行的次数
function fib(n) {
count++;
if (n === 0 || n === 1) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}
优化之后的代码
let count = 0; // 执行的次数
function fib(n, memo = {}) {
let result;
count++;
if (memo[n]) {
return memo[n];
}
if (n === 0 || n === 1) {
result = 1;
} else {
result = fib(n - 1, memo) + fib(n - 2, memo);
}
memo[n] = result;
return result;
}
console.log('fib(3)', fib(3)); // fib(3) 3
console.log('count', count); // 5
count = 0;
console.log('fib(4)', fib(4)); // fib(3) 5
console.log('count', count); // 7
count = 0;
console.log('fib(5)', fib(5)); // fib(3) 8
console.log('count', count); // 9
count = 0;
console.log('fib(6)', fib(6)); // fib(3) 13
console.log('count', count); // 11
count = 0;
console.log('fib(20)', fib(20)); // fib(3) 10946
console.log('count', count); // 39
count = 0;
console.log('fib(30)', fib(30)); // fib(3) 1346269
console.log('count', count); // 59
count = 0;
console.log('fib(40)', fib(40)); // fib(3) 165580141
console.log('count', count); // 79
count = 0;
// 故,时间复杂度 T = 2 * n => O(n) 线性时间复杂度