学习指南

问题分解

计算机科学· 第13单元:计算思维与问题求解· 10 分钟阅读

1. 什么是问题分解?★☆☆☆☆⏱ 3 min

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

📘 定义

问题分解

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

例:

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

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

📐 例题

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

  1. 1

    首先,列出应用的所有核心需求,识别自然划分:用户下单、管理员管理菜单、系统处理支付。

  2. 2

    将问题拆分为三个独立的顶层子问题:1) 用户下单功能 2) 管理员菜单管理 3) 支付处理。

  3. 3

    对每个顶层子问题进一步分解。例如,用户下单功能可拆分为:浏览菜单、选择商品、修改订单、提交订单。

  4. 4

    每个最终子问题现在都足够小,可以在整合所有解决方案之前独立进行设计、编码和测试。

2. 常见分解方法★★☆☆☆⏱ 5 min

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

方法对比

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

函数分解

根据系统需要执行的操作/功能拆分问题。每个子问题对应一个功能。

+ 优点: 对小型问题简单,符合过程式编程范式

− 缺点: 大型系统难以扩展和维护

面向对象分解

根据系统中的核心实体(对象)拆分问题。每个子问题涵盖一个实体的属性和方法。

+ 优点: 符合面向对象编程(OOP)范式,大型系统更容易扩展

− 缺点: 对小型简单问题过于复杂

📐 例题

用两种方法分解学生成绩册

  1. 1

    函数分解:按所需操作拆分:添加学生成绩、计算平均成绩、生成成绩报告、搜索学生。每个操作都是一个独立的子问题。

  2. 2

    面向对象分解(第一层):识别核心实体:学生(Student)、成绩册(GradeBook)、报告(Report)。每个实体都是一个主要子问题。

  3. 3

    面向对象分解(第二层):按需求拆分每个实体。对于学生实体:存储ID/姓名、添加成绩、返回成绩。对于成绩册实体:存储所有学生信息、搜索学生、计算总平均分。

3. 分解题目的考试要求★★☆☆☆⏱ 4 min

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

✓ 快速检测

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

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

    • 所有子问题都是相互依赖的

    • 每个子问题都可以独立求解

    • 子问题和原问题大小相同

    • 分解只进行一级就停止

    显示答案
    1

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

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

    • 1

    • 2

    • 5

    • 任意数量

    显示答案
    1

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

4. 常见陷阱

错误做法:

只进行一级分解就停止,留下大而复杂的子问题

原因:

大型子问题保留了和原问题相同的复杂度,违背了分解的目的

正确做法:

重复分解,直到每个最终子问题都足够小,可以编码为单个函数或类

错误做法:

创建重叠的子问题,共享相同职责

原因:

重叠会导致代码重复,在需要修改时会让调试变得困难得多

正确做法:

确保每个子问题只有一个明确职责,没有功能重叠

错误做法:

在理解原问题的所有需求之前就开始分解

原因:

如果你不知道问题需要完成什么,你的分解会遗漏关键需求

正确做法:

拆分出子问题之前,一定要先列出原问题的所有需求

错误做法:

在考试答案中混合分解方法,没有清晰结构

原因:

无结构的混合分解难以让阅卷老师理解,会导致失分

正确做法:

选择一种方法,坚持使用,并明确说明你使用的方法

5. 速查表

核心原则

考试提示

拆分为小的子问题

分解直到每个子问题只解决一个明确任务

保持子问题独立

最小化依赖以简化测试

至少展示2级分解

大多数分解题目要拿满分必须满足这个要求

选择正确的方法

过程式代码用函数分解,OOP问题用面向对象分解

真题中的出现

AI 根据考纲规律估算的考点位置,请对照官方真题核实准确性。仅作复习重点参考。

  • 2022 · 12

    分解一个电影票预订系统

  • 2024 · 11

    解释问题分解的好处

深入阅读

下一步

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