如果你看到这则信息,这表示下载可汗学院的外部资源时遇到困难.

If you're behind a web filter, please make sure that the domains *.kastatic.org and *.kasandbox.org are unblocked.

主要内容

指令的条件重复

有时我们不知道自己想要重复一个指令的次数,但我们知道我们想要它在某个条件为真的时候停止。在这种情况下,程序员使用类似 while 循环 的编程构造重复代码。

while 循环

这是JavaScript语言中while循环的通用模板:
while ( <condition> ) {
    <instructions>
}
<condition>为真时,计算机不断重复<instructions>
从概念上讲,while循环非常类似于if条件,除了while连续执行,直到它不再为真,而if只执行一次。
我们有时使用流程图可视化while循环,类似于我们可视化条件的方式:
让我们看一个简单的 while 循环:
var i = 1;
while (i <= 10) {
    println(i);
    i++;
}
📝 查看相似代码: 应用实验室 | Snap | Python
该代码将输出数字1到10,然后一旦i变为11并因此不再小于或等于10,计算机将停止输出i的值。
这个例子很简单,但也非常类似于while循环的所有用法。我们的代码通常首先在while之前初始化一个变量(或多个),然后在条件中引用该变量(或相关的变量),然后在指令中以某种方式修改该变量。
这个特殊的while循环示例通常被编程为for循环,因为我们提前知道我们希望代码重复的次数。有很多次我们不知道重复代码的确切次数。我们现在先探讨其中一个。

兔子繁殖程序

想象一下,农民决定养兔子,但她担心兔子会繁殖得太快。农民只有100只兔子的空间,想要知道从2只兔子到兔子超过100只所需要的时间是多少。
我们可以创建一个程序,只要兔子数量不足100,就能不断模拟兔子的繁殖,并记录它需要多少年。
这是该方案的第一稿:
var numRabbits = 2;
var numYears = 0;
while (numRabbits <= 100) {
    numRabbits += (numRabbits/2 * 30);
    numYears++;
}
📝 查看相似代码: 应用实验室 | Snap | Python
该程序首先将兔子群体初始化为2(交配对),并将0传递给年数。while循环检查兔子的数量是否小于100。只要该条件为真, 循环内的代码增加了兔子的数量(根据每年母兔子可以繁衍多少小兔子的估计值),然后增加年数。
运行程序 之后,我们可以看到估算结果只代入了2年,在这2年后,将会有 512只兔子。Yeesh!农民最好建造一支更大的养殖场或考虑一下养可爱的毛茸茸的羊。
✏️我们还可以将 while 循环与其他编程技巧结合起来。下面的程序是一个更高级的兔子复制器,它使用嵌套的 for 循环和 if 随机决定一只兔子是母的还是公的。调整数值,看看每次数字如何变化!
📝 查看相似代码: 应用实验室 | Snap | Python

小心无限循环

只有在 while 循环内的条件为假时,计算机才会退出循环。 但是,如果它永远不是假的呢?
查看下面的程序:
var i = 0;
while (i < 100) {
   println("这是一个永不结束的循环。");
   println("是的,永不结束,我的朋友...");
   println("计算开始允许这个代码,并不知道代码是否会结束...");
   println("计算机会永远执行下去只是因为...");
}
你认为会发生什么?亲自尝试一下!不,等等,不要!那是一个无限循环,而且很难知道计算机将如何处理它。我们尝试在KA编程环境中检测并防止无限循环 - 但我们并不总是成功 - 因此最好避免它们。
为什么这个循环无限? 该程序首先将i初始化为0,然后while循环检查i是否小于100。在结果为真时,它会显示一首流行歌曲的歌词。循环中的任何变化都 无法 改变i的值,因此该条件将永远为真。
作为程序员,您可能会在生涯中编写至少一个无限循环。当你发现自己整在盯着控制台上一连串的输出并且散热器风扇的声音越来越大时,可以庆祝自己写出了第一个无限循环的成就。在你完成庆祝(并使计算机恢复健康状态)之后,再思考思考那些未来不该做的事情。😉
测验你的理解
看看你是否能够发现无限循环。这些程序中哪个存在无限循环?
选择所有正确的答案:

在伪代码中的条件循环

AP CSP 检查伪代码不包含while循环,而是包含一个非常相似的结构:REPEAT UNTIL
REPEAT UNTIL (条件)
{ 
    <指令>
}
此代码将重复指令 直到 条件最终是真的。
要从while移植到REPEAT UNTIL,我们通常只需要反转条件。
这是一个显示数字1到10的简单循环的案例:
i ← 1
REPEAT UNTIL (i ≥ 11)
{
    DISPLAY(i)
    i ← i + 1
}
当它是while时,我们检查i是否小于或等于10。现在我们使用UNTIL,我们检查i是否大于或等于11。在这种情况下,我们甚至可以简化它来检查它是否等于11,因为在这段代码中,i无法变为大于11。
现在让我们看看伪代码中的兔子复制器:
numRabbits ← 2
numYears ← 0
REPEAT UNTIL (numRabbits > 100) 
{
    numRabbits ← numRabbits + (numRabbits/2 * 30)
    numYears ← numYears + 1
}
使用while循环,我们的条件检查numRabbits <= 100。 现在我们正在使用UNTIL,所以我们检查numRabbits> 100
🙋🏽🙋🏻‍♀️🙋🏿‍♂️你对这个章节还有问题吗?我们会尽力回答— 请在下面提问框里留言!

想加入讨论吗?

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