动态规划之斐波那契数列

动态规划(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 来存储前两个斐波那契数。

在每次迭代中,我们更新这两个变量的值为新的斐波那契数。

这种方法只需要常数级别的空间。

以上就是文章全部内容了,如果喜欢这篇文章的话,还希望三连支持一下,感谢!

相关推荐
Ocean☾4 分钟前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序12 分钟前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
爱吃生蚝的于勒34 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~38 分钟前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
王哈哈^_^1 小时前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城1 小时前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
脉牛杂德1 小时前
多项式加法——C语言
数据结构·c++·算法
legend_jz1 小时前
STL--哈希
c++·算法·哈希算法
kingmax542120082 小时前
初三数学,最优解问题
算法
一直学习永不止步2 小时前
LeetCode题练习与总结:赎金信--383
java·数据结构·算法·leetcode·字符串·哈希表·计数