问题分解
计算机科学· 第13单元:计算思维与问题求解· 10 分钟阅读
1. 什么是问题分解?★☆☆☆☆⏱ 3 min
问题分解(也称为自顶向下分解或分而治之)是求解任何复杂计算问题的基础第一步。它将一个难以处理的大问题拆分为更小、独立的子问题。
问题分解
一种核心计算思维技术,将复杂问题拆分为更小的独立子问题,每个子问题都有清晰明确的目标。
例:
将学校考勤系统分解为数据录入、报表生成和用户认证三个子问题。
良好的分解给开发带来三个核心优势:通过让开发者一次只处理一个小部分来降低认知负荷,支持团队项目的并行开发,并且通过将错误隔离到单个子问题来简化测试。
分解构建一个简单在线咖啡订购应用的问题
- 1
首先,列出应用的所有核心需求,识别自然划分:用户下单、管理员管理菜单、系统处理支付。
- 2
将问题拆分为三个独立的顶层子问题:1) 用户下单功能 2) 管理员菜单管理 3) 支付处理。
- 3
对每个顶层子问题进一步分解。例如,用户下单功能可拆分为:浏览菜单、选择商品、修改订单、提交订单。
- 4
每个最终子问题现在都足够小,可以在整合所有解决方案之前独立进行设计、编码和测试。
2. 常见分解方法★★☆☆☆⏱ 5 min
在CIE 9618中,你可以根据问题类型和后续使用的编程方法选择两种标准分解方法。
考试题目中最常用的两种方法是:
函数分解
根据系统需要执行的操作/功能拆分问题。每个子问题对应一个功能。
+ 优点: 对小型问题简单,符合过程式编程范式
− 缺点: 大型系统难以扩展和维护
面向对象分解
根据系统中的核心实体(对象)拆分问题。每个子问题涵盖一个实体的属性和方法。
+ 优点: 符合面向对象编程(OOP)范式,大型系统更容易扩展
− 缺点: 对小型简单问题过于复杂
用两种方法分解学生成绩册
- 1
函数分解:按所需操作拆分:添加学生成绩、计算平均成绩、生成成绩报告、搜索学生。每个操作都是一个独立的子问题。
- 2
面向对象分解(第一层):识别核心实体:学生(Student)、成绩册(GradeBook)、报告(Report)。每个实体都是一个主要子问题。
- 3
面向对象分解(第二层):按需求拆分每个实体。对于学生实体:存储ID/姓名、添加成绩、返回成绩。对于成绩册实体:存储所有学生信息、搜索学生、计算总平均分。
3. 分解题目的考试要求★★☆☆☆⏱ 4 min
要在CIE 9618的分解题目中拿到满分,你的答案需要符合题目指令词的要求。
测试你对考试要求的理解:
下列哪一项是良好分解的特征?
所有子问题都是相互依赖的
每个子问题都可以独立求解
子问题和原问题大小相同
分解只进行一级就停止
显示答案
1 —正确。独立子问题是分解的核心目标,能够简化测试和开发流程。
考试答案中你至少需要展示多少级分解?
1
2
5
任意数量
显示答案
1 —正确。CIE阅卷老师要求至少展示两级分解,以证明你能够将问题拆分为可处理的部分。
4. 常见陷阱
错误做法:
只进行一级分解就停止,留下大而复杂的子问题
原因:
大型子问题保留了和原问题相同的复杂度,违背了分解的目的
正确做法:
重复分解,直到每个最终子问题都足够小,可以编码为单个函数或类
错误做法:
创建重叠的子问题,共享相同职责
原因:
重叠会导致代码重复,在需要修改时会让调试变得困难得多
正确做法:
确保每个子问题只有一个明确职责,没有功能重叠
错误做法:
在理解原问题的所有需求之前就开始分解
原因:
如果你不知道问题需要完成什么,你的分解会遗漏关键需求
正确做法:
拆分出子问题之前,一定要先列出原问题的所有需求
错误做法:
在考试答案中混合分解方法,没有清晰结构
原因:
无结构的混合分解难以让阅卷老师理解,会导致失分
正确做法:
选择一种方法,坚持使用,并明确说明你使用的方法
5. 速查表
核心原则 | 考试提示 |
|---|---|
拆分为小的子问题 | 分解直到每个子问题只解决一个明确任务 |
保持子问题独立 | 最小化依赖以简化测试 |
至少展示2级分解 | 大多数分解题目要拿满分必须满足这个要求 |
选择正确的方法 | 过程式代码用函数分解,OOP问题用面向对象分解 |
真题中的出现
AI 根据考纲规律估算的考点位置,请对照官方真题核实准确性。仅作复习重点参考。
- 2022 · 12
分解一个电影票预订系统
- 2024 · 11
解释问题分解的好处
深入阅读
下一步
问题分解是所有计算问题求解的基础第一步,分解的质量直接影响最终解决方案的设计、编码和测试难度。它是所有其他核心计算思维技术(包括模式识别、抽象和算法设计)的起点。对于基于OOP的问题,分解也是识别核心类和对象的方式,因此是面向对象设计题目必备的关键技能。掌握分解能让所有后续编程和问题求解主题更容易学习,也更容易在考试中应用。
