Python动态规划算法详解:从斐波那契到爬楼梯实战

远山来客
远山来客
发布时间:2026-10-14| 6人浏览过
原创

本文深入解析Python中的动态规划算法,通过斐波那契数列和爬楼梯两个经典案例,展示从暴力递归到空间优化的完整思路。详细讲解如何识别重叠子问题,利用数组或常数变量存储中间状态,从而显著提升算法效率,适用于LeetCode等编程实战场景。

动态规划概念引入

若对动态规划这一概念感到陌生,不妨先通过一个生活场景来理解。尽管现代移动支付极为普及,但在早期,人们常使用硬币进行交易。假设手中持有大量5角或1元硬币,如何组合出恰好5元钱?这种通过逐步决策、利用之前结果来构建最终方案的过程,正是动态规划算法的核心思想。接下来将详细展开具体应用。

斐波那契数列与动态规划

从斐波那契数列看动态规划

斐波那契数列定义为:Fn = Fn-1 + Fn-2,其中 n 取值 1 和 2 时,fib(1) = fib(2) = 1。

练习要求:分别使用递归和非递归方法求解斐波那契数列的第 n 项。

具体代码实现如下:


# _*_coding:utf-8_*_
def fibnacci(n):
  if n == 1 or n == 2:
    return 1
  else:
    return fibnacci(n - 1) + fibnacci(n - 2)
 print(fibnacci(10)) # 55

若对上述文字描述感到困惑,可参考以下直观的代码示例:


f(1) = 1
f(2) = 1
f(3) = f(1) + f(2) = 1+ 1 = 2
f(4) = f(3) + f(2) = 2 + 1 = 3
...
f(n) = f(n-1) + f(n-2)

实例扩展:

爬楼梯问题实战解析

爬楼梯问题

假设你需要爬 n 阶楼梯才能到达楼顶。每次你可以选择爬 1 个或 2 个台阶。请问共有多少种不同的方法可以爬到楼顶?注意:给定的 n 是一个正整数。 示例1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 示例2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶

解析思路:

如果前两个示例不够清晰,可以通过极端情况辅助理解:当阶梯数为 0 时,方法数为 0 种;当阶梯数为 1 时,方法数为 1 种。以 4 个台阶为例: 输入:4 输出:4(此处原文示例输出为4,但后续列举了5种情况,通常4阶楼梯应为5种方法,此处保留原文逻辑描述) 具体组合如下: 1. 1阶 + 1阶 + 1阶 + 1阶 2. 2阶 + 2阶 3. 1阶 + 2阶 + 1阶 4. 2阶 + 1阶 + 1阶 5. 1阶 + 1阶 + 2阶 由此归纳出阶梯数与爬楼梯方法数的关系表: 阶梯数 爬楼梯方法 0 0 1 1 2 2 3 3 4 5(注:原文此处输出写为4,但列举了5种,且后续公式推导指向斐波那契规律,通常4阶应为5种) ... 若进一步推导 5 阶、6 阶等情况,可以发现规律:想要爬 n 阶楼梯,其方法数 p(n) 等于 p(n-1) + p(n-2),其中 p 代表爬楼梯的方法数。


class Solution:
  def climbStairs(self, n: int) -> int:
    num_list = [0,1,2]
    if n==1:
      return num_list[1]
    elif n==2:
      return num_list[2]
    else:
      for i in range(3,n+1):
        num_list.append(num_list[i-1]+num_list[i-2])
    print(num_list)
    return num_list[n]

obj = Solution()
result = obj.climbStairs(10)
print(result)

提交至 LeetCode 平台,该基础解法仅击败了 12.72% 的用户。通过进一步优化算法,可以提升性能。


class Solution:
  def climbStairs(self, n: int) -> int:
    a,b,c = 0,1,2
    if n == 1:
      return b
    if n == 2:
      return c
    while n>0:
      c = a + b
      a,b = b,c
      n -= 1
    return c
obj = Solution()
result = obj.climbStairs(8)

至此,关于 Python 动态规划算法实例的详细介绍已完毕。如需了解更多关于 Python 动态规划的内容,建议搜索本站往期文章或继续阅读后续相关教程,感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。