动态规划(Dynamic Programming, DP)是一种算法策略,用于解决具有重叠子问题和最优子结构特性的问题。
问题描述
斐波那契数列是一个每一项都是前两项和的序列:0, 1, 1, 2, 3, 5, 8, 13, ...
动态规划解法
使用递归方法解决斐波那契数列问题会有很多重复计算,而动态规划通过存储中间结果来避免这种情况。
样例
计算斐波那契数列的第 n 项。
javascript
// 动态规划求解斐波那契数列
function fibonacci(n) {
// 创建一个数组来存储斐波那契数列的中间结果
let fib = new Array(n + 1);
// 初始值
fib[0] = 0;
fib[1] = 1;
// 计算斐波那契数列的值
for (let i = 2; i <= n; i++) {
fib[i] = fib[i - 1] + fib[i - 2];
}
// 返回第 n 项
return fib[n];
}
// 示例:计算斐波那契数列的第 10 项
console.log(fibonacci(10)); // 输出 55
解释
我们创建了一个数组 fib 来存储已经计算过的斐波那契数列的值。
我们从第 2 项开始,使用 fib[i - 1] + fib[i - 2] 来计算当前项,这样避免了递归中的重复计算。
最终,fib[n] 存储的就是斐波那契数列的第 n 项。
优化空间复杂度
上述解法的空间复杂度为 O(n),我们可以通过只存储前两个值来优化到 O(1)。
优化后的代码
javascript
function fibonacciOptimized(n) {
if (n <= 1) return n;
let prev = 0;
let current = 1;
for (let i = 2; i <= n; i++) {
let temp = current;
current = prev + current;
prev = temp;
}
return current;
}
// 示例:计算斐波那契数列的第 10 项
console.log(fibonacciOptimized(10)); // 输出 55
解释
我们使用两个变量 prev 和 current 来存储前两个斐波那契数。
在每次迭代中,我们更新这两个变量的值为新的斐波那契数。
这种方法只需要常数级别的空间。
以上就是文章全部内容了,如果喜欢这篇文章的话,还希望三连支持一下,感谢!