下面的代码使用 AP CSP 伪代码(AP CSP pseudocode)——考试的语言中立参考。赋值写作 a ← expression,而列表索引从 1 开始。
算法与编程
AP 计算机科学原理 · 第 3 主题
3.1
变量与赋值
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-1 | AAP-1.A |
|
AAP-1.B |
|
来源:美国大学理事会 AP 课程与考试说明
一个变量(variable)是一个持有一个值的命名的地方。赋值(assignment)运算符把右边的值存进左边的变量:

a ← 5
b ← a + 3 // b is now 8
一个变量一次持有一个值;再次赋值替换它。变量让一个程序存储输入、记住结果,并重用它们。
Watch a variable hold and change its value
A variable is a named box that stores one value at a time. An assignment copies a value into the box; assigning again overwrites whatever was there.
| 英文 | 中文 | 拼音 |
|---|---|---|
| variable | 变量 | biàn liàng |
| assignment | 赋值 | fù zhí |
3.2
数据抽象
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-1 | AAP-1.C |
|
AAP-1.D |
|
来源:美国大学理事会 AP 课程与考试说明
数据抽象(data abstraction)让你通过给一个数据搜集一个单一的名字来管理复杂性——例如,一个列表而不是几十个分开的变量。它隐藏细节:你使用命名的搜集而不担心它如何被存储。列表(下面)是课程的主要数据抽象。
| 英文 | 中文 | 拼音 |
|---|---|---|
| Data abstraction | 数据抽象 | shù jù chōu xiàng |
| abstraction | 抽象 | chōu xiàng |
3.3
数学表达式
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-2 | AAP-2.A |
|
AAP-2.B |
| |
AAP-2.C |
|
来源:美国大学理事会 AP 课程与考试说明
程序用运算符 +、-、*、/ 和 MOD(一次除法的余数(remainder),例如 17 MOD 5 是 2)计算。表达式遵循通常的运算顺序。MOD 对测试可除性(n MOD 2 = 0 意味着 n 是偶数)和把值环绕一个范围尤其有用。
Evaluate an expression step by step
An expression is evaluated with order of operations: multiplication and division happen before addition and subtraction, left to right.
| 英文 | 中文 | 拼音 |
|---|---|---|
| remainder | 余数 | yú shù |
3.4
字符串
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-2 | AAP-2.D |
|
来源:美国大学理事会 AP 课程与考试说明
一个字符串(string)是一个有序的字符序列,像 "hello"。程序连接字符串(拼接(concatenation))并找它们的长度。字符串表示文本——名字、消息、序列——而且是一个常见的程序输入和输出。
| 英文 | 中文 | 拼音 |
|---|---|---|
| string | 字符串 | zì fú chuàn |
| concatenation | 拼接 | pīn jiē |
3.5
布尔表达式
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-2 | AAP-2.E |
|
AAP-2.F |
|
来源:美国大学理事会 AP 课程与考试说明
一个布尔表达式(Boolean expression)求值为 true 或 false。它使用关系运算符(=、≠、<、>、≤、≥)和逻辑运算符 NOT、AND、OR:

NOT反转一个值,AND只在两侧都真时为真,OR在至少一侧为真时为真。
这些条件驱动每个决定和循环。
Try the OR truth table
A Boolean expression is either true (1) or false (0). OR is true when at least one input is true; flip the inputs to see every case.
| 英文 | 中文 | 拼音 |
|---|---|---|
| Boolean expression | 布尔表达式 | bù ěr biǎo dá shì |
3.6
条件语句
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-2 | AAP-2.G |
|
AAP-2.H |
|
来源:美国大学理事会 AP 课程与考试说明
一个条件语句(选择)(conditional (selection))选择运行哪段代码。IF 只在它的条件为真时运行一个块;ELSE 给出一个替代:

IF (score ≥ 60)
{
DISPLAY("Pass")
}
ELSE
{
DISPLAY("Fail")
}
Follow an if / else decision
A conditional runs one branch or another depending on whether its condition is true. Slide the value across the threshold and watch which branch is taken.
| 英文 | 中文 | 拼音 |
|---|---|---|
| conditional (selection) | 条件语句 | tiáo jiàn yǔ jù |
3.7
嵌套条件语句
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-2 | AAP-2.I |
|
来源:美国大学理事会 AP 课程与考试说明
一个嵌套条件(nested conditional)把一个 IF 放进另一个里面(或链接 ELSE IF)以在多于两条路径中选择。只有第一个匹配的分支运行:
IF (g ≥ 90) { grade ← "A" }
ELSE IF (g ≥ 80) { grade ← "B" }
ELSE { grade ← "C" }
| 英文 | 中文 | 拼音 |
|---|---|---|
| nested conditional | 嵌套条件 | qiàn tào tiáo jiàn |
3.8
迭代
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-2 | AAP-2.J |
|
AAP-2.K |
|
来源:美国大学理事会 AP 课程与考试说明
迭代(一个循环)(iteration (a loop))重复指令。AP 伪代码有两种形式:

REPEAT 5 TIMES // a fixed count
{
DISPLAY("hi")
}
REPEAT UNTIL (found) // until a condition becomes true
{
...
}
一个从不满足它停止条件的循环是一个无限循环(infinite loop)。
Trace a loop one pass at a time
A loop repeats a block while its counter runs through a range. Step through to watch the counter and the running total update each pass.
| 英文 | 中文 | 拼音 |
|---|---|---|
| Iteration (a loop) | 迭代 | dié dài |
| infinite loop | 无限循环 | wú xiàn xún huán |
3.9
开发算法
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-2 | AAP-2.L |
|
AAP-2.M |
|
来源:美国大学理事会 AP 课程与考试说明
一个算法(algorithm)是解决一个问题的一个有限的步骤序列,由顺序(sequencing)、选择(selection)和迭代(iteration)构建。不同的算法能解决同一个问题,而你应当能够组合和修改现有的算法(例如,数一个列表里满足一个条件的值,或找最大的)。手工跟踪一个算法以检查它正确。

| 英文 | 中文 | 拼音 |
|---|---|---|
| algorithm | 算法 | suàn fǎ |
3.10
列表
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-2 | AAP-2.N |
|
AAP-2.O |
|
来源:美国大学理事会 AP 课程与考试说明
一个列表(list)是一个名字下的一个有序的值搜集,课程的关键数据抽象。AP 伪代码从 1 索引:

scores ← [88, 74, 95]
DISPLAY(scores[1]) // 88
scores[2] ← 80 // replace the 2nd value
APPEND(scores, 60) // add to the end
INSERT(scores, 1, 100) // insert at index 1
REMOVE(scores, 3) // delete the 3rd element
LENGTH(scores) // how many elements
用一个循环遍历一个列表以求和、计数、搜索,或找一个最大值:
FOR EACH x IN scores
{
total ← total + x
}
| 英文 | 中文 | 拼音 |
|---|---|---|
| list | 列表 | liè biǎo |
3.11
二分查找
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-2 | AAP-2.P |
|
来源:美国大学理事会 AP 课程与考试说明
二分搜索(binary search)在一个排序的列表里比检查每个元素快得多地找到一个值。它看中间的元素,然后丢弃不能包含目标的那一半,重复直到找到。每一步把搜索空间减半,所以一个 $n$ 个项的列表取约 $\log_2 n$ 步。它需要数据先被排序。

Worked example. 搜索一个 $8$ 个项的排序列表,二分搜索每一步把范围减半:$8\rightarrow4\rightarrow2\rightarrow1$,最多 $3$ 次比较($\log_2 8=3$),而一个线性搜索可能取多达 $8$。优势爆炸式增长:约 $1{,}000$ 个项只需要 $\approx10$ 个二分搜索步(但多达 $1{,}000$ 个线性的),而 $1{,}000{,}000$ 个项只需要 $\approx20$。减半是使它成为一个合理时间算法的东西。
| 英文 | 中文 | 拼音 |
|---|---|---|
| Binary search | 二分搜索 | èr fēn sōu suǒ |
3.12
调用过程
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-3 | AAP-3.A |
|
来源:美国大学理事会 AP 课程与考试说明
一个过程(函数)(procedure (function))是一个命名的、可重用的代码块。调用它以你提供的实参(arguments)运行它的代码,而它可能返回一个值:
sum ← Add(3, 4) // call, passing 3 and 4
过程让你使用代码而不知道它的内部工作——过程抽象(procedural abstraction)。
| 英文 | 中文 | 拼音 |
|---|---|---|
| procedure (function) | 过程 | guò chéng |
| procedural abstraction | 过程抽象 | guò chéng chōu xiàng |
3.13
开发过程
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-3 | AAP-3.B |
|
AAP-3.C |
|
来源:美国大学理事会 AP 课程与考试说明
你用一个名字、参数(parameters)(输入)和一个主体定义一个过程,并可选地 RETURN 一个结果:

PROCEDURE Add(a, b)
{
RETURN(a + b)
}
写你自己的过程减少重复、把一个大问题分解成命名的片段,并使程序可读且更容易测试——抽象(abstraction)的本质。
3.14
库
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-3 | AAP-3.D |
|
来源:美国大学理事会 AP 课程与考试说明
一个库(library)是一个其他人能重用的现成过程的搜集。一个 API(应用程序接口,Application Program Interface)记录每个过程做什么、它的参数,和它的结果——所以你能使用它而不看它的代码。库节省时间并让你能建立在现有的、经过测试的工作之上。
| 英文 | 中文 | 拼音 |
|---|---|---|
| library | 库 | kù |
| Interface | 应用程序接口 | yìng yòng chéng xù jiē kǒu |
3.15
随机值
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-3 | AAP-3.E |
|
来源:美国大学理事会 AP 课程与考试说明
RANDOM(a, b) 返回一个从 a 到 b(含)的随机整数,让一个程序产生不可预测的结果——用于游戏、抽样,或模拟。每个调用可能给出一个不同的值,所以一个使用随机性的程序每次运行行为不同。
3.16
模拟
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-3 | AAP-3.F |
|
来源:美国大学理事会 AP 课程与考试说明
一个模拟(simulation)是一个为一个现实世界过程建模以安全而廉价地研究它的程序。模拟简化现实(它们省略细节)并常常用随机性来模仿偶然事件。它们让你测试在现实生活里会太昂贵、缓慢或危险的场景——但它们的结果只与它们的假设一样好。
| 英文 | 中文 | 拼音 |
|---|---|---|
| simulation | 模拟 | mó nǐ |
3.17
算法效率
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-4 | AAP-4.A |
|
来源:美国大学理事会 AP 课程与考试说明
效率(efficiency)是一个算法随着它的输入增长需要多少时间(或内存)。一个合理时间(reasonable-time)算法的工作像输入大小的一个多项式那样增长(例如线性或二次);一个不合理时间(unreasonable-time)算法增长得远快(例如每加一个项就加倍),对大输入变得不切实际。一个更快的算法能使一个先前不可能的问题可解。有时一个精确答案取太久,所以一个启发式(heuristic)——一个快速找到一个足够好答案的方法——被改用。

| 英文 | 中文 | 拼音 |
|---|---|---|
| Efficiency | 效率 | xiào lǜ |
| heuristic | 启发式 | qǐ fā shì |
3.18
不可判定问题
大纲
| Enduring Understanding | Learning Objective | Essential Knowledge |
|---|---|---|
AAP-4 | AAP-4.B |
|
来源:美国大学理事会 AP 课程与考试说明
一些问题是不可判定(undecidable)的:没有算法能用一个正确的是/否答案解决它们的每个情况。这是计算的一个根本限制——不是需要一台更快计算机的问题,而是没有这样的算法能存在的一个证明。
考试技能: 能够通过跟踪确定一个代码段的结果、比较两个算法的效率(合理 vs 不合理时间),并在一个程序里辨认过程和数据抽象。
| 英文 | 中文 | 拼音 |
|---|---|---|
| undecidable | 不可判定 | bù kě pàn dìng |
3.18
考试技巧
- 知道一个变量是一个值的命名存储并逐步跟踪赋值如何更新它。
- 仔细读 AP 伪代码——
a <- expression赋值,而列表在考试参考表上是1 索引的。 - 把一个变量与一个列表(一个由索引访问的搜集)区分开并正确地使用列表操作。
- 用正确的优先级和布尔逻辑(
AND、OR、NOT)求表达式的值。 - 挑选清晰的、有意义的变量名——书面任务奖励可读的代码。
本主题的互动课程
逐步学习,并即时检测练习。