news 2026/4/23 12:53:11

每天五分钟:leetcode动态规划-递归与递推_day2

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
每天五分钟:leetcode动态规划-递归与递推_day2

0)先记住一句话(贯穿两种写法)

到第n阶的方法数:

  • 最后一步要么走 1 阶:从n-1

  • 要么走 2 阶:从n-2

所以永远是:

f(n) = f(n-1) + f(n-2)


1)递归版本(从“大问题”往下问“小问题”)

✅ 1.1 纯递归(不推荐:会爆炸慢)

想法:我想知道f(n),那就去问f(n-1)f(n-2)

def climbStairs(n): if n <= 2: return n return climbStairs(n-1) + climbStairs(n-2)

为什么慢?

因为它会“重复算同一个问题”:

比如算f(5)

f(5)=f(4)+f(3) f(4)=f(3)+f(2) f(3)=f(2)+f(1)

你看:f(3)f(2)被算了很多遍。

复杂度:接近O(2^n),n 稍大就非常慢。


✅ 1.2 递归 + 记忆化(推荐:递归也能很快)

核心:每个f(k)只算一次,算过就记下来,下次直接拿。

def climbStairs(n): memo = {} def dfs(k): if k <= 2: return k if k in memo: return memo[k] memo[k] = dfs(k-1) + dfs(k-2) return memo[k] return dfs(n)

复杂度O(n)
因为1...n每个值只算一次。


2)递推版本(从“小问题”一路推到“大问题”)

递推就是:我先知道最小的答案,然后一步步算到 n。

✅ 2.1 DP 数组版(最直观)

dp[i] 代表到 i 阶的方法数 从 i=3 推到 n

复杂度O(n)时间,O(n)空间。


✅ 2.2 空间优化版(你写的版本:最常用

观察转移方程:

dp[i]只依赖dp[i-1]dp[i-2]
所以没必要保存整个数组,只保留最近两个数就够了。

class Solution: def climbStairs(self, n: int) -> int: if n <= 2: return n a, b = 1, 2 # dp[1], dp[2] for _ in range(3, n + 1): a, b = b, a + b return b

复杂度O(n)时间,O(1)空间。

3)递归 vs 递推:一眼对比

写法思维方向是否重复计算时间复杂度空间复杂度
纯递归自顶向下(n→1)✅会大量重复O(2^n)O(n) 递归栈
递归+记忆化自顶向下(n→1)❌不重复O(n)O(n)
递推 DP 数组自底向上(1→n)❌不重复O(n)O(n)
递推 空间优化自底向上(1→n)❌不重复O(n)O(1)

4)一句话解释

  • 递归:像问路——“到第 n 阶怎么走?那我先问到 n-1 怎么走,再问到 n-2 怎么走。”

  • 递推:像建楼——“先把 1 阶、2 阶的答案写出来,然后一层层推上去。”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:35:36

9.28总结

9.28总结 知识回顾 # 1. 封装一个函数&#xff1a;获取指定数据的阶乘 【没有指定数据的话默认求10的阶乘】 默认参数 # 阶乘 比如5&#xff01;5*4*3*2*1 # 未知数据 有1个 # 是否需要返回结果 def factorial(num10):result 1for i in range(num, 0, -1):result * ireturn…

作者头像 李华
网站建设 2026/4/23 11:38:29

浅谈:算法中的斐波那契数(一)

我们先来看题目描述&#xff1a;斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为斐波那契数列。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a;F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1.给…

作者头像 李华
网站建设 2026/4/23 11:38:26

低代码平台的测试挑战:测试从业者的新战场

随着低代码开发平台在企业数字化转型中的广泛应用&#xff0c;软件测试领域正面临前所未有的范式转变。据Gartner预测&#xff0c;到2025年&#xff0c;70%的新应用将由低代码平台开发&#xff0c;这一趋势正在重新定义测试工程师的角色定位和方法体系。作为测试从业者&#xf…

作者头像 李华
网站建设 2026/4/21 21:11:29

【奶茶Beta专项】【LVGL9.4源码分析】09-core-obj_class对象类系统

【奶茶Beta专项】【LVGL9.4源码分析】09-core-obj_class对象类系统 1 概述1.1 文档目的1.2 代码版本与范围 2 设计意图与总体定位2.1 lv_obj_class 承担了什么角色2.2 类描述结构的关键字段2.3 对象创建流程中的类系统参与 3 接口分类与 API 速查表3.1 类相关核心接口3.2 类行为…

作者头像 李华
网站建设 2026/4/23 11:38:46

Anthropic文章-打造高性能智能体 学习笔记

Anthropic 工程师会从“实践导向、极简优先、模式化落地”三个核心维度总结文章观点&#xff0c;核心结论如下&#xff0c;完全贴合原文工程师视角与技术落地逻辑&#xff1a; 一、核心前提&#xff1a;明确 Agent 与 Workflow 的定义边界 Workflow&#xff08;工作流&#xff…

作者头像 李华
网站建设 2026/4/22 12:37:48

FlutterOpenHarmony商城App标签选择组件开发

前言 标签选择是商城应用中常见的交互组件&#xff0c;用于商品规格选择、筛选条件选择、兴趣标签选择等场景。一个设计良好的标签选择组件需要支持单选和多选模式&#xff0c;并提供清晰的选中状态反馈。本文将详细介绍如何在Flutter和OpenHarmony平台上开发标签选择组件。 标…

作者头像 李华