迭代 (Iteration) — AP Computer Science A CS A 学习指南
适合谁:AP Computer Science A 参加 AP Computer Science A 的考生。
覆盖内容:while/for/do-while循环、嵌套循环、循环计数器模式、手动循环追踪、差一错误5类核心考点,搭配常见陷阱、真题风格练习题与备考速查表。
前置知识:基础 Java 或任何其他过程式语言编程。
关于练习题:下文「练习题」一节的所有题目均为我们按 AP Computer Science A 风格编写的原创题目 (original problems),仅用于教学。它们不是 College Board 真题的复制,措辞、数值或语境可能不同。请把它们当作练手用;评分细则请对照 College Board 官方 mark scheme。
1. 什么是迭代(Iteration)?
迭代(也叫循环)是程序中重复执行某一段代码块的核心控制结构,属于AP CS A考纲Unit 4的唯一核心考点,也是后续数组、ArrayList、排序算法、二维数组等章节的必备基础,在选择题和FRQ中占比约15%。迭代的核心逻辑是:只要给定的布尔条件为真,就重复执行目标代码块,直到条件不成立时退出循环,避免了手动复制重复代码的冗余问题。
2. while、for、do-while 循环
迭代的三种基础实现结构各有适用场景,你需要熟练掌握三者的语法和执行逻辑差异:
while 循环(while loop)
语法为 while (布尔表达式) { 代码块 },执行逻辑是先判断条件,再执行代码块:如果布尔表达式为true就执行代码块,执行完再次判断条件,直到表达式为false时退出。适合循环次数不确定的场景,比如判断用户输入是否合法。
范例:计算1到10的和:
int sum = 0, i = 1;
while (i <= 10) {
sum += i;
i++; // 必须更新计数器,否则会进入无限循环
}
// 最终sum = 55
for 循环(for loop)
语法为 for (初始化语句; 布尔条件; 更新语句) { 代码块 },执行逻辑是:先执行一次初始化语句,然后判断条件,成立则执行代码块,再执行更新语句,重复判断-执行-更新的流程,直到条件不成立。适合提前知道循环次数的场景,是考试中最常用的循环结构。
上述求和的for循环实现:
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
do-while 循环(do-while loop)
语法为 do { 代码块 } while (布尔表达式);,执行逻辑是先执行一次代码块,再判断条件,因此无论条件是否成立,代码块至少会执行1次,末尾必须加分号,适合需要先执行一次操作再判断的场景,比如菜单功能。
如果将求和的i初始值设为11,do-while的结果会和前两者不同:
int sum = 0, i = 11;
do {
sum += i;
i++;
} while (i <= 10);
// 最终sum = 11,因为先执行了一次代码块再判断条件
3. 嵌套循环(Nested loops)
嵌套循环指在一个循环的代码块内部再定义另一个循环,执行逻辑是:外层循环每执行1次,内层循环会完整执行所有轮次,总执行次数为外层循环次数 × 内层循环次数,考官常考嵌套循环的执行次数统计。
最典型的应用是打印矩阵或九九乘法表,范例:打印4行6列的#矩阵:
for (int i = 0; i < 4; i++) { // 外层循环控制行数,执行4次
for (int j = 0; j < 6; j++) { // 内层循环控制列数,每次执行6次
System.out.print("#");
}
System.out.println(); // 每行打印完换行
}
⚠️ 注意:内外层循环的计数器变量不能重名,否则会修改外层循环的计数,导致逻辑错误。
4. 循环计数器模式(Loop counter patterns)
考试中90%的循环题都属于以下三类计数器模式,你可以直接套用:
- 累加模式:初始值
sum = 0,每次循环将目标值加到sum上,用于计算总和、平均值等。 - 计数模式:初始值
count = 0,满足指定条件时count++,用于统计符合要求的元素个数。 - 乘积模式:初始值
product = 1(注意不能是0),每次循环将目标值乘到product上,用于计算阶乘、幂运算等。 范例:统计数组int[] arr = {2,5,7,10,13,16}中能被2整除的元素个数:
int count = 0;
for (int num : arr) { // 增强for循环,遍历数组所有元素
if (num % 2 == 0) {
count++;
}
}
// 最终count = 3
5. 手动追踪循环(Tracing loops by hand)
AP CS A考试不允许使用编译器,因此你必须掌握手动追踪循环变量变化的能力,这是选择题的高频考点,追踪步骤固定:
- 列出所有涉及的变量,记录初始值;
- 每执行一次循环,依次更新所有变量的值,记录每轮后的状态;
- 当布尔条件为
false时停止,输出最终结果。 范例:追踪下列代码的最终x、y值:
int x = 0, y = 5;
while (x < y) {
x += 2;
y--;
}
追踪过程:
- 初始:x=0,y=5,0<5成立,执行后x=2,y=4
- 第二轮:2<4成立,执行后x=4,y=3
- 第三轮:4<3不成立,退出循环
最终结果:
x=4,y=3
6. 差一错误(Off-by-one errors)
差一错误是循环题最常见的丢分点,指循环的边界条件设置错误,导致循环多执行1次或少执行1次,常见场景有两种:
- 循环次数设置错误:比如要执行10次循环,写了
for(int i=1; i<10; i++),实际只执行了9次,正确应该是i<=10或者i从0到i<10。 - 数组遍历错误:数组长度为n时索引范围是
0~n-1,如果写了for(int i=0; i<=n; i++),会触发ArrayIndexOutOfBoundsException运行时错误。 范例:要计算1到10的和,若将条件写为i<10,则最终sum为45,比正确值55少了10,就是典型的差一错误。
7. 常见陷阱 (Common Pitfalls)
- 无限循环:写while循环时忘记更新计数器,比如
while(i<=10) {sum +=i;}漏写i++,程序会一直运行。学生常因注意力放在业务逻辑上遗漏计数器更新,正确做法是写while循环时先写计数器更新语句,再补充业务逻辑。 - do-while漏写分号:do-while循环的while语句末尾必须加分号,否则会触发编译错误,学生容易和while循环的语法混淆,正确做法是写完do代码块后立刻补全
while(条件);的分号。 - for循环分隔符错误:for循环的初始化部分定义多个变量时要用逗号分隔,比如
for(int i=0, sum=0; i<10; i++),如果写成int i=0; sum=0;会触发编译错误,三个核心部分(初始化、条件、更新)才用分号分隔。 - 循环条件用赋值符号:把判断相等的
==写成赋值符号=,比如while(i = 10),布尔条件恒为true,会进入无限循环,学生常因手误写错,写完条件后要二次检查符号。
8. 练习题 (AP CS A 风格)
第1题(选择题)
下列代码执行后sum的值是多少?
int sum = 0;
for(int i=0; i<=5; i++) {
if(i%2 == 1) sum +=i;
}
A. 3 B. 9 C. 15 D. 6 解答:遍历i从0到5,奇数为1、3、5,和为,选B。
第2题(填空题)
下列代码执行后count的值是多少?
int count = 0, i = 0;
do {
count++;
i +=2;
} while(i < 10);
解答:追踪过程:初始count=0,i=0→第一次count=1,i=2→第二次count=2,i=4→第三次count=3,i=6→第四次count=4,i=8→第五次count=5,i=10,此时i<10不成立,退出,最终count=5。
第3题(FRQ题)
编写代码用嵌套循环打印九九乘法表,格式为j*i=乘积,每行i个式子(i为行数,从1到9)。
解答:
for(int i=1; i<=9; i++) { // 外层控制行数
for(int j=1; j<=i; j++) { // 内层控制每行的式子个数
System.out.print(j + "*" + i + "=" + i*j + "\t");
}
System.out.println(); // 每行结束换行
}
9. 速查表 (Quick Reference Cheatsheet)
| 类别 | 核心规则 | 注意事项 |
|---|---|---|
| while循环 | while(布尔条件) {代码块} |
先判断后执行,可能执行0次,必须更新计数器 |
| for循环 | for(初始化; 条件; 更新) {代码块} |
已知循环次数优先使用,多变量初始化用逗号分隔 |
| do-while循环 | do {代码块} while(布尔条件); |
先执行后判断,至少执行1次,末尾必须加分号 |
| 嵌套循环 | 外层循环1次,内层循环完整执行 | 总执行次数=外层次数×内层次数,变量不可重名 |
| 计数器模式 | 累加sum=0,计数count=0,乘积product=1 | 乘积初始值不能为0 |
| 差一错误规避 | 执行n次循环用i=0;i<n或i=1;i<=n |
数组遍历必须用i=0;i<arr.length |
10. 接下来怎么学
迭代是AP CS A的核心基础,后续Unit 6的数组遍历、Unit 7的ArrayList操作、Unit 8的二维数组、Unit 10的排序与递归算法都会大量用到循环结构,你需要完全掌握本章节的所有考点,尤其是手动追踪循环和差一错误规避,才能顺利学习后续内容,避免出现知识断层。 如果你在练习迭代相关题目时遇到任何问题,都可以随时到小欧提问,我们会为你提供针对性的讲解和辅导。