# 问题分解

> 计算机科学 · CIE A-Level 9618
> 来源: https://www.owlsprep.com/zh/study/cie-9618-u13-problem-decomposition/

问题分解是计算问题求解中核心的第一步。本学习指南涵盖分解的定义、优势、实用方法，以及CIE 9618考试中需要避免的常见错误。

**先修:** [对计算问题求解有基础理解](https://www.owlsprep.com/zh/study/cie-9618-u13-intro-computational-thinking/)

## 学习目标

- 解释问题分解的定义及其在计算问题求解中的作用
- 将复杂问题分解为可处理、独立的子问题
- 在考试题目中对比函数分解和面向对象分解方法
- 解答CIE 9618的分解题目时避免常见误区

## 什么是问题分解？

问题分解（也称为自顶向下分解或分而治之）是求解任何复杂计算问题的基础第一步。它将一个难以处理的大问题拆分为更小、独立的子问题。

**问题分解** — 一种核心计算思维技术，将复杂问题拆分为更小的独立子问题，每个子问题都有清晰明确的目标。

*例:* 将学校考勤系统分解为数据录入、报表生成和用户认证三个子问题。

良好的分解给开发带来三个核心优势：通过让开发者一次只处理一个小部分来降低认知负荷，支持团队项目的并行开发，并且通过将错误隔离到单个子问题来简化测试。

**例题:** 分解构建一个简单在线咖啡订购应用的问题

1. 首先，列出应用的所有核心需求，识别自然划分：用户下单、管理员管理菜单、系统处理支付。
2. 将问题拆分为三个独立的顶层子问题：1) 用户下单功能 2) 管理员菜单管理 3) 支付处理。
3. 对每个顶层子问题进一步分解。例如，用户下单功能可拆分为：浏览菜单、选择商品、修改订单、提交订单。
4. 每个最终子问题现在都足够小，可以在整合所有解决方案之前独立进行设计、编码和测试。

## 常见分解方法

在CIE 9618中，你可以根据问题类型和后续使用的编程方法选择两种标准分解方法。

**方法对比**

考试题目中最常用的两种方法是：

- **函数分解** — 根据系统需要执行的操作/功能拆分问题。每个子问题对应一个功能。
  - 优点: 对小型问题简单，符合过程式编程范式
  - 缺点: 大型系统难以扩展和维护

- **面向对象分解** — 根据系统中的核心实体（对象）拆分问题。每个子问题涵盖一个实体的属性和方法。
  - 优点: 符合面向对象编程（OOP）范式，大型系统更容易扩展
  - 缺点: 对小型简单问题过于复杂

**例题:** 用两种方法分解学生成绩册

1. 函数分解：按所需操作拆分：添加学生成绩、计算平均成绩、生成成绩报告、搜索学生。每个操作都是一个独立的子问题。
2. 面向对象分解（第一层）：识别核心实体：学生（Student）、成绩册（GradeBook）、报告（Report）。每个实体都是一个主要子问题。
3. 面向对象分解（第二层）：按需求拆分每个实体。对于学生实体：存储ID/姓名、添加成绩、返回成绩。对于成绩册实体：存储所有学生信息、搜索学生、计算总平均分。

> **tip**
>
> 如果题目没有指定方法，一定要说明你使用的是哪种方法，让阅卷老师清楚你的解题思路。

## 分解题目的考试要求

要在CIE 9618的分解题目中拿到满分，你的答案需要符合题目指令词的要求。

**考试命令词**

- **Decompose** — 将问题拆分为子问题，并展示层次结构 *(阅卷老师要求至少展示两级分解才能给满分)*

- **Explain benefits of decomposition** — 将优势和题目给出的具体问题关联起来 *(不要只列出通用优势，要解释它为什么对这个问题有帮助)*

**概念自测**

测试你对考试要求的理解：

1. 下列哪一项是良好分解的特征？

   - 所有子问题都是相互依赖的
   - 每个子问题都可以独立求解
   - 子问题和原问题大小相同
   - 分解只进行一级就停止

   *答案:* 每个子问题都可以独立求解

   *解析:* 正确。独立子问题是分解的核心目标，能够简化测试和开发流程。

2. 考试答案中你至少需要展示多少级分解？

   - 1
   - 2
   - 5
   - 任意数量

   *答案:* 2

   *解析:* 正确。CIE阅卷老师要求至少展示两级分解，以证明你能够将问题拆分为可处理的部分。

## 常见错误

- **错误做法:** 只进行一级分解就停止，留下大而复杂的子问题
  - 原因: 大型子问题保留了和原问题相同的复杂度，违背了分解的目的
  - 正确做法: 重复分解，直到每个最终子问题都足够小，可以编码为单个函数或类
- **错误做法:** 创建重叠的子问题，共享相同职责
  - 原因: 重叠会导致代码重复，在需要修改时会让调试变得困难得多
  - 正确做法: 确保每个子问题只有一个明确职责，没有功能重叠
- **错误做法:** 在理解原问题的所有需求之前就开始分解
  - 原因: 如果你不知道问题需要完成什么，你的分解会遗漏关键需求
  - 正确做法: 拆分出子问题之前，一定要先列出原问题的所有需求
- **错误做法:** 在考试答案中混合分解方法，没有清晰结构
  - 原因: 无结构的混合分解难以让阅卷老师理解，会导致失分
  - 正确做法: 选择一种方法，坚持使用，并明确说明你使用的方法

## 速查表

| 核心原则 | 考试提示 |
| --- | --- |
| 拆分为小的子问题 | 分解直到每个子问题只解决一个明确任务 |
| 保持子问题独立 | 最小化依赖以简化测试 |
| 至少展示2级分解 | 大多数分解题目要拿满分必须满足这个要求 |
| 选择正确的方法 | 过程式代码用函数分解，OOP问题用面向对象分解 |

## 下一步

问题分解是所有计算问题求解的基础第一步，分解的质量直接影响最终解决方案的设计、编码和测试难度。它是所有其他核心计算思维技术（包括模式识别、抽象和算法设计）的起点。对于基于OOP的问题，分解也是识别核心类和对象的方式，因此是面向对象设计题目必备的关键技能。掌握分解能让所有后续编程和问题求解主题更容易学习，也更容易在考试中应用。

- [模式识别](https://www.owlsprep.com/zh/study/cie-9618-u13-pattern-recognition/)
- [抽象](https://www.owlsprep.com/zh/study/cie-9618-u13-abstraction/)
- [面向对象问题求解](https://www.owlsprep.com/zh/study/cie-9618-u13-object-oriented-problem-solving/)

---

来自 [OwlsPrep](https://www.owlsprep.com) —— A-Level / IB / AP / IGCSE 免费学习指南，依据官方考纲编写。原页面：https://www.owlsprep.com/zh/study/cie-9618-u13-problem-decomposition/
