主要内容
指令的有限重复
这个世界充满了重复:一位科学家重复一项实验100次并记录结果,一位园丁种植整齐的生菜,每隔2英寸种一排,一台3D打印机一层又一层地重复打印。
计算机程序也充满了重复,因为我们的程序自动化和模拟我们周围的世界。程序员使用for循环重复一组特定次数的指令。
对循环的需要
假设我们正在编写一个程序,输出9的乘法表。
我们可以这样编码前13个乘法:
println(9 * 0);
println(9 * 1);
println(9 * 2);
println(9 * 3);
println(9 * 4);
println(9 * 5);
println(9 * 6);
println(9 * 7);
println(9 * 8);
println(9 * 9);
println(9 * 10);
println(9 * 11);
println(9 * 12);
这是可行的,但是这种方法有一些缺点。如果我们想显示前 100 个乘法呢?还需要87行代码!如果我们决定向每个显示添加一些文本呢?我们必须修改100行代码!
使用for循环,我们可以告诉计算机重复一条指令,这样我们就不需要在代码中重复它。
我们可以用JavaScript中的
for
循环重写代码,如下:for (var i = 0; i < 13; i++) {
println(9 * i);
}
每个
for
循环都从圆括号内的一个包含3部分的头开始。头部遵循这个模板:for (初始化; 条件; 递增/递减)
这些部分都使用计数器变量。该变量跟踪当前循环到的次数,通常命名为
i
。初始化部分将计数器变量初始化为起始值。
在本例中(
var i = 0
),初始值为0,因为我们首先显示9乘以0。条件 部分告诉计算机是否继续重复。计算机每次评估条件,如果表达式为真,则执行带括号内部的指令。否则,它将完全退出循环。
在本例中(
i < 13
),条件检查计数器变量是否小于13,因为我们希望最终的倍数为12。在每次重复之后,递增/递减部分修改计数器变量。
在本例中(
i++
),我们只想让变量+1,因为我们遍历了0到12的整数值。 在
for
循环头之后,总是有一组大括号,大括号中包含每次计算机执行的指令。指令通常引用计数器变量,但并不总是这样。✏️ 下面的程序显示了从0到5的数字的平方。试着改变它来显示更多的平方数,然后显示每个数字的立方。
循环变量
在编程中最常见的循环将从0开始,在某个数字之前停止,每次递增1。然而,通过改变循环的各个部分,我们可以创建以许多其他方式重复的循环。
例如,这个程序使用
for
循环从10倒数到1:for (var i = 10; i > 0; i--) {
println(i);
}
注意差异:
- 初始化部分,我们将计数器变量设置为10。
- 条件部分,我们检查计数器变量是否 大于 0。这意味着最后的重复将是计数器变量为1时,计算机将退出循环。
- 在最后一部分中,我们从计数器变量中减去1。
下面是另一个例子,
for
循环显示从0到20的偶数:for (var i = 0; i <= 20; i += 2) {
println(i);
}
这个循环从0开始,但不同之处在于:
- 条件检查计数器变量是否小于 或等于 20。这意味着这个循环 将会 显示 20。如果它仅仅 小于 ,它将在18处停止。
- 最后一部分向计数器变量+2,而不是通常的1。
for
循环的灵活性意味着我们可以用它编写多种重复的程序。需要注意的是,灵活性也会让你更容易犯错!看看你是否能找出这些例子中的错误。
嵌套循环
嵌套循环允许我们沿着两个维度进行重复。
让我们在一个编码示例中研究一下。我们之前做了一个9的乘法表。如果我们需要学习1到10的所有数字呢?用嵌套循环来拯救我们!
这段JavaScript代码使用一个嵌套的
for
循环来显示数字1-10的乘法表:for (var i = 1; i <= 10; i++) {
for (var j = 1; j <= 10; j++) {
println(i * j);
}
}
外部for循环从1开始,在10停止,每次加1。内部的
for
循环执行完全相同的操作,但是使用了不同的计数器变量名。指令显示两个计数器变量的乘积。理解计算机执行循环指令的顺序很重要。对于外部
for
循环的每次迭代,计算机将经历内部 for
循环的10次迭代。在前10次迭代中,外部计数器变量 i
始终为1,只有内部变量j
会改变,从1递增到10。用伪代码编写循环
for
循环的语法在不同的语言中是不同的,并不是所有的语言都有 for
循环。然而,所有语言都有某种方式来重复一定次数的代码。这个伪代码表示重复指令
n
次:REPEAT n TIMES
{
<instructions>
}
这是显示9的倍数(从1到12)的等价伪代码:
i ← 1
REPEAT 12 TIMES
{
DISPLAY(9 * i)
i ← i + 1
}
由于
REPEAT
没有包含3个部分的头部,所以我们需要在 REPEAT
头部之前初始化计数器变量,并在主体的末尾增加计数器变量。再举一个例子,下面是显示倒数从10到1的伪代码:
i ← 10
REPEAT 10 TIMES
{
DISPLAY(i)
i ← i - 1
}