If you're seeing this message, it means we're having trouble loading external resources on our website.

如果你被网页过滤器挡住,请确保域名*.kastatic.org*.kasandbox.org 没有被阻止.

主要内容

指令的有限重复

这个世界充满了重复:一位科学家重复一项实验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的数字的平方。试着改变它来显示更多的平方数,然后显示每个数字的立方。
📝 类似的代码在: 应用实验室 | Snap | Python

循环变量

在编程中最常见的循环将从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 循环的灵活性意味着我们可以用它编写多种重复的程序。需要注意的是,灵活性也会让你更容易犯错!看看你是否能找出这些例子中的错误。
测验你的理解
这个for循环应该显示从1到10的数字:
for (var i = 0; i < 10; i++) {
    println(i);
}
然而,代码并不完全正确。
下面哪个代码片段正确地显示了从1到10的数字?
选择所有正确的答案:

嵌套循环

嵌套循环允许我们沿着两个维度进行重复。
让我们在一个编码示例中研究一下。我们之前做了一个9的乘法表。如果我们需要学习1到10的所有数字呢?用嵌套循环来拯救我们!
这段JavaScript代码使用一个嵌套的 for 循环来显示数字1-10的乘法表:
for (var i = 1; i <= 10; i++) {
  for (var j = 1; j <= 10; j++) {
    println(i * j);
  }
}
运行代码 | 📝 类似的代码见: 应用实验室 | Snap | Python
外部for循环从1开始,在10停止,每次加1。内部的 for 循环执行完全相同的操作,但是使用了不同的计数器变量名。指令显示两个计数器变量的乘积。
理解计算机执行循环指令的顺序很重要。对于外部 for 循环的每次迭代,计算机将经历内部 for 循环的10次迭代。在前10次迭代中,外部计数器变量 i始终为1,只有内部变量j会改变,从1递增到10。
更深度的解释, 这个视频 讨论了执行嵌套循环的计算机的可视化。你可以自己在 JSTutor 试玩一下。
测验你的理解
在上面的例子中,println() 将被调用多少次?
  • 你的答案是
  • 一个整数,例如 6
  • 一个最简真分数,如 3/5
  • 一个最简假分数,如 7/4
  • 一个混合带分数,例如 1 3/4
  • 一个精确的十进位小数,例如0.75
  • pi 的倍数, 例如 12\ \text{pi} 或 2/3\ \text{pi}$

当计算机执行完两个循环时,变量 ij将存储哪些值?
选出正确答案:

我们经常使用嵌套循环对行和列中的数据进行可视化和操作。
想象一个有一排排生菜的菜地:每一排都有重复种植的生菜,然后重复这些排来填充整个菜地。一排生菜是一个循环;所有排的整个菜地是一个嵌套循环。
✏️下面的程序安置一个5×5的雪人阵列。把它改成5排,每排10个雪人,然后是10排,每排5个雪人。
📝 类似的代码见: 应用实验室 | Snap | Python

用伪代码编写循环

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
}

想加入讨论吗?

尚无帖子。
你会英语吗?单击此处查看更多可汗学院英文版的讨论.