欢迎来到抽象化与自动化的世界!

在本章中,我们将探索计算机科学家的思维方式。你有没有想过,编程人员是如何编写像飞行模拟器或全球社交网络这样复杂的程序的呢?其中的秘诀不仅仅是“数学要好”,而是掌握抽象化(Abstraction)自动化(Automation)。我们将学习如何从问题中剔除“冗余信息”,并将其转化为计算机可以处理的一系列指令。这些技能正是计算理论(Theory of Computation)的基石。

1. 掌握解题与算法

在告诉计算机该做什么之前,我们需要一个计划。这个计划就称为算法(Algorithm)。

什么是算法?

算法是一系列为了完成特定任务而遵循的步骤。最重要的一点是,算法必须总是会终止(它不能无限地运行下去!)。

算法的构建区块

如果刚开始觉得很困难也不用担心;大多数算法都是由以下四种简单的结构构建而成的:

  • 序列(Sequence):将指令按正确的顺序排列。
  • 赋值(Assignment):为变量赋予数值(例如:score = 0)。
  • 选择(Selection):使用 IF 语句进行决策。
  • 迭代(Iteration):使用 FORWHILE 循环重复步骤。

手动跟踪与逻辑

为了检查算法是否有效,我们使用手动跟踪(Hand-tracing)。这就像你自己扮演计算机的角色,使用“追踪表(Trace table)”来记录每个步骤中变量的值。这能帮助你利用逻辑推理(Logical reasoning)来证明你的程序是正确且高效的。

快速复习:算法就像计算机的食谱。它必须清晰、有序,并且必须要有终点!

重点总结:解题涉及将逻辑问题拆解为使用标准编程结构、且能最终结束的一系列步骤。

2. 抽象化的艺术

抽象化是一种简化复杂现实的过程,让我们能专注于真正重要的事物。试想伦敦地铁的路线图;它不会显示轨道的每一个弯曲,也不会标示树木在哪里。它只显示车站和路线。这就是抽象化!

表征抽象化(Representational Abstraction)

这是指通过移除所有不必要的细节来建立问题的表征。如果你正在制作一个赛车游戏,你需要知道汽车的速度和位置,但你不需要模拟车门烤漆的化学成分!

概括抽象化(分类)

这是根据共同特征将事物分组。我们经常使用一种称为“是一种(is a kind of)”的阶层关系

例子:『黄金猎犬』『狗』的一种,而『狗』又『哺乳类动物』的一种。

信息隐藏(Information Hiding)

这是一个隐藏所有与本质特征无关的对象细节的过程。这就像代码的“必要知情”原则。如果程序的一部分不需要知道某个数值是如何计算出来的,我们就会隐藏该复杂性。

你知道吗?使用抽象化会让你的代码更容易维护。如果你更改了某个隐藏的细节,你不需要修复整个程序!

重点总结:抽象化就是“减少细节”以使问题易于管理,并通过“分组”来掌握大局。

3. 功能抽象化的层次

抽象化不仅关于对象,也关于我们如何使用代码和数据。

程序抽象化(Procedural Abstraction)

这涉及抽象化运算中所使用的实际数值,从而建立一种计算模式。我们将特定的任务转化为一个程序(Procedure)
例子:与其每次写程序来计算半径为 5 的圆面积,我们写一个 Area(radius) 程序,这样就能适用于任何数字。

功能抽象化(Functional Abstraction)

这更进一步:具体的计算方法被隐藏起来了。你不需要关心函数“如何”计算出结果;你只关心当你给它输入时,它能给你正确的输出。这是将程序抽象化作为“黑盒(Black box)”来处理的结果。

数据抽象化(Data Abstraction)

这是一种隐藏数据实际表示方式的方法论。新的数据对象可以由先前定义的类型构建而成。
例子:你可能会在程序中使用堆栈(Stack)。你知道你可以对它进行“推入(push)”和“弹出(pop)”操作,但你不需要知道计算机在底层是否使用数组(Array)指针(Pointer)来实现它。

常见错误:学生经常混淆程序抽象化与功能抽象化。请记住:程序抽象化是关于建立可重复使用的模式;功能抽象化是关于完全隐藏“如何运作”的过程,并将其视为一种数学映射。

重点总结:我们可以通过抽象化程序(模式)、函数(黑盒)和数据(隐藏存储细节)来简化工作。

4. 拆解、合成与归约

我们该如何建立庞大且复杂的系统呢?我们使用三种具体策略:

拆解(Decomposition)

这意味着将问题拆解为子问题。每个子问题都应完成一个可识别的任务。你可以不断地细分,直到每一块都变得容易解决。

合成(Composition)

这是拆解的相反!它是结合多个程序以形成复合程序,或是结合多个数据对象以形成复合数据结构(例如树状数据结构)。

问题抽象化(归约,Reduction)

这是一个聪明的技巧:通过移除问题细节,直到它看起来像是一个已经被解决过的问题。如果你能证明你的新问题只是旧问题的一种变体,那么你就可以直接使用旧的解决方案!

重点总结:拆解(Decomposition)与合成(Composition)让我们能系统化地解决大型问题。

5. 自动化

最后是自动化(Automation)。这是计算机科学的“行动”阶段。自动化是将我们的抽象模型投入实作以解决问题。

我们如何实现自动化?
  1. 建立算法来解决模型。
  2. 实作模型于数据结构中。
  3. 编写代码执行指令。
  4. 运行代码。

记忆小撇步:自动化视为建模 + 实作。计算机科学不仅仅是编写代码,它更在于为“混乱的”现实世界建立“简洁的”模型,并让机器执行这些模型。

快速复习:
- 拆解(Decomposition):拆解它。
- 合成(Composition):建立它。
- 自动化(Automation):让它运作。

重点总结:自动化是最后一步,通过计算机将我们的模型和算法转化为现实运作的成果。