
一起动脑筋 · 先看一个小故事
机器人要办一场积分赛:收集分数、找冠军、打印奖状。女孩把它拆成能单独检查的小任务。
把过程摊开来看
- 收集确认分数合法
- 统计找到最高分
- 处理并列按规则确定名单
- 展示输出名单
拆分让每一步都有明确输入和输出。
子任务合起来必须覆盖原问题,例如“有并列怎么办”不能因为拆成几块就被遗忘。
01为什么要拆问题?
大问题一次想完很困难,但很多大问题由多个简单任务组成。
大问题→几个小问题→组合答案
02可以按步骤拆
例如“读入成绩并输出最高分学生名字”:
- 读入数据
- 找最大成绩
- 记录对应学生
- 输出答案
03可以按子问题拆
递归和动态规划中常见:
当前问题 = 更小子问题 + 当前这一点工作
例如阶乘、区间问题、树结构都经常这样思考。
04可以先解决一个简化版本
如果原题很复杂,可以先问:
- 如果 n 只有 5 怎么做?
- 如果只需要判断“有没有”而不是求最优呢?
- 如果没有某个特殊限制呢?
简化后更容易看见核心结构。
05拆得越碎越好吗?
不是。
如果一个小问题必须依赖很多外部细节,拆得太碎反而会让关系更混乱。
06怎样判断拆分是否合理?
职责清楚
每块在解决什么?
接口明确
它需要什么输入?产生什么结果?
可以组合
小问题答案能组成最终答案。
你已经知道了什么
- 复杂问题可以拆成更简单的子任务。
- 可以按步骤、状态或更小子问题拆。
- 先解决简化版能帮助发现核心规律。
- 拆得过碎也可能增加复杂度。
- 好的拆分要职责清楚、输入输出明确、能够组合。
下一篇:为什么要先从最简单的情况开始?
轮到你来试一试
找冠军函数返回 2,显示函数怎么知道它表示第二名、下标还是分数?
想好了吗?点开看解释
要事先约定返回值含义和编号规则,并用清楚的名字或结构表达。