news 2026/6/9 21:25:30

递归思想的思路分享

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
递归思想的思路分享

文章目录


你的感悟非常深刻!👏
“考虑太多冗余条件,使得函数复杂,无法形成递归” —— 这正是很多初学者(甚至有经验的开发者)在写递归/动态规划时最容易陷入的陷阱。

而你提到的 “只考虑最简单情况 + 一个数量关系,用递归四两拨千斤”,恰恰是递归与 DP 的核心哲学。

下面我们来系统总结:如何写出简洁、优雅、有效的递归?

🌟 一、递归设计的核心原则

✅ 原则1:只关心“当前一步”做什么,其余交给递归

  • 不要试图在当前层“把所有事情做完”
  • 只需回答两个问题:
    1. 我现在能做什么选择?(比如:选 or 不选硬币)
    2. 每种选择后,剩下的问题是什么?(子问题)

💡 递归的魔力在于:相信子问题会被正确解决,你只需组合结果。

例子:零钱兑换

  • 当前选择:用 or 不用 coins[i]
  • 子问题:
    • 不用 → dfs(i-1, c)
    • 用 → dfs(i, c - coins[i])(因为可重复用)
  • 组合:取最小值 + 1(如果用了)

不需要判断“能不能整除”、“余数是否为0”等中间细节!

✅ 原则2:边界条件越简单越好

  • 最理想的 base case 是:
    • if amount == 0: return 0
    • if i 0: return inf
  • 不要在中间加各种 elif 分支,除非绝对必要

❌ 冗余条件示例(你之前写的):
if amount % coin == 0:
return …
elif amount % coin != amount:

这些都是试图提前优化,但破坏了递归结构。

✅ 正确做法:让递归自然走到 c == 0 或 c < 0,由 base case 处理。

✅ 原则3:状态定义要“刚好足够”

  • 状态变量(如 i, c)应该恰好描述子问题的全部信息
  • 不能多(导致状态爆炸),也不能少(无法转移)

在零钱兑换中:

  • i:考虑到第几个硬币(控制“可用硬币集合”)
  • c:还需要凑多少钱(控制“目标”)

这两个就刚好足够,不多不少。

🛠 二、递归构思的实用技巧

🔧 技巧1:从“暴力递归”开始,再加缓存
先不考虑效率,写出最朴素的递归:

def dfs©:
if c == 0: return 0
if c < 0: return inf
res = inf
for coin in coins:
res = min(res, dfs(c - coin) + 1)
return res

✅ 这个版本逻辑极其清晰!
然后再加 @cache 就变成高效解法。

📌 先写对,再优化。不要一开始就想着剪枝、提前终止。

🔧 技巧2:用“选 or 不选”框架处理组合问题
很多 DP 问题都可以套这个模板:
问题类型 决策 状态转移
0-1 背包 选 or 不选(物品只能用一次) dfs(i-1, w) vs dfs(i-1, w - weight[i]) + value[i]

完全背包 选 or 不选(物品可用多次) dfs(i-1, w) vs dfs(i, w - weight[i]) + value[i]

子集/排列 选 or 不选当前元素 dfs(i+1, path) vs dfs(i+1, path + [x])

你只需要识别问题属于哪一类,套用对应转移即可。

🔧 技巧3:画一个小例子,手动模拟递归树
比如 coins=[1,2], amount=3,手动展开:

dfs(3)
├─ 1 + dfs(2)
│ ├─ 1 + dfs(1)
│ │ └─ 1 + dfs(0) = 1 → total=3
│ └─ 1 + dfs(0) = 1 → total=2
└─ 1 + dfs(1)
└─ … → total=2
→ min = 2

通过这个过程,你会直观看到状态如何转移,从而写出正确代码。

🔧 技巧4:避免“过程思维”,采用“结果思维”

  • ❌ 错误思维:“我该怎么一步步凑出金额?”
  • ✅ 正确思维:“最少硬币数 = 1 + min(凑出 amount - coin 的最少硬币数)”

递归是自顶向下、结果导向的,不是过程模拟。

🧘 三、心法:如何培养“递归直觉”?

  1. 多写暴力递归(哪怕超时),感受子问题结构
  2. 刻意练习经典模型:斐波那契、爬楼梯、背包、子集、全排列
  3. 每次写完问自己:
    • 我的状态定义是否清晰?
    • 我的 base case 是否覆盖所有终止情况?
    • 我是否在当前层做了本该由子问题处理的事?

✅ 回到你的顿悟

“正确答案就考虑最简单情况,还有使用一个数量关系,利用递归产生四两拨千斤的效果”

这正是分治思想的体现:

  • 把大问题拆成小问题
  • 小问题和大问题结构相同
  • 只需定义好“如何拆”和“如何合”

而 min(dfs(i-1, c), dfs(i, c - coins[i]) + 1) 就是这个“拆与合”的完美表达。

🎁 最后送你一句口诀:

“状态定义清,边界写得简;
当前做选择,其余靠递归。”

坚持这样思考,你的递归和 DP 能力会飞速提升!🚀

如果你愿意,我可以给你几道“从暴力递归 → 记忆化 → DP”的渐进式练习题 😊

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

Leetcode21. 合并两个有序链表

问题描述&#xff1a;将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a;输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a;输入&#xff1a;l1 [], l2 [] 输出…

作者头像 李华
网站建设 2026/6/9 12:54:33

借助大数据分析实现电商市场洞察

借助大数据分析实现电商市场洞察 关键词:大数据分析、电商市场洞察、数据挖掘、消费者行为、市场趋势 摘要:本文围绕借助大数据分析实现电商市场洞察展开,深入探讨了大数据在电商领域的重要性及应用。详细介绍了相关核心概念、算法原理、数学模型,通过项目实战展示了如何运…

作者头像 李华
网站建设 2026/6/6 3:23:06

从心出发,向善而行——北京东慧公益基金会成立大会在京圆满举办

立春时节&#xff0c;春意渐暖&#xff0c;善念生辉。近日&#xff0c;以“从心出发&#xff0c;向善而行”为主题的北京东慧公益基金会成立大会在北京成功举办。来自首都教育、健康、文化、慈善等领域行业协会的嘉宾&#xff0c;以及北京、天津、上海、广州、成都、武汉等多地…

作者头像 李华
网站建设 2026/6/6 7:13:15

智慧园区:那些被技术消灭的“沉默成本”

当访客在写字楼前台排队登记时&#xff0c;当上班族在停车场兜圈找车位时&#xff0c;当会议室空调对着空无一人的房间持续制冷时——这些被习以为常的低效场景&#xff0c;正在智慧园区的升级浪潮中被逐个击破。传统园区里那些隐形的“沉默成本”&#xff0c;那些被忽视的时间…

作者头像 李华
网站建设 2026/6/6 12:26:10

对标国际标杆,数字冰雹 智能作战想定编辑工具 定义“新一代”战场仿真

在国防智能化转型加速的今天&#xff0c;作战推演、军事训练、装备研发等场景对 “高保真、全场景、高效率” 想定编辑工具的需求日益迫切。一款能够精准复刻战场环境、支撑多维度任务需求、适配不同用户层级的作战想定工具&#xff0c;成为打通 “仿真 - 训练 - 实战” 链路的…

作者头像 李华
网站建设 2026/6/9 0:14:30

SSM智能线上教育mo0l5(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面

系统程序文件列表 系统项目功能&#xff1a;学员,教师,课程类型,课程,课件资料,课程目录 SSM智能线上教育系统开题报告 一、课题研究背景与意义 &#xff08;一&#xff09;研究背景 随着互联网技术与教育行业的深度融合&#xff0c;线上教育已成为传统教育的重要补充&#…

作者头像 李华