while语句的一些好的用法是什么?

What are some good uses of the while statement?

本文关键字:用法 是什么 语句 while      更新时间:2023-09-26

每当我想到使用while loop时,我不明白为什么我不能使用if statement代替。我知道while循环在给定语句为真时运行,但如果条件在块内立即终止,那么我无法想象在为真时发生任何事情。如果有人能给我如何/为什么我应该使用while loop的例子。非常感谢。

我将尽量给你一个高层次的答案,因为我认为这将更容易直观地理解。

把所有的算法想象成食谱。一个典型的食谱可能有如下部分:

  • 如果花生有壳,将其与壳分离
  • 将鸡蛋打至起泡
  • 取5个洋葱,每个切成两半

这些类型的指示让你以不同的方式完成任务。

第一个实际上是一个"if"语句。如果一个条件(花生有壳)是真的,你就做某事。

if (not shelled) {
  shell the peanut! // happens once
}

第二个是while循环。当还没有打匀和起泡的时候,你打鸡蛋。你不断地重复同样的事情(搅拌),当你这样做的时候,你会看它(一遍又一遍),看看它是否已经变得非常起泡。一旦它变得起泡,搅拌得足够充分,你就可以停下来了。当你停止时,那是因为你已经通过了"While"条件。需要注意的一件重要事情是,在你开始之前,你不一定知道要打多少次鸡蛋才能打好。你只需要做很多次,并(用你的眼睛)检查很多次。

while(not whipped enough) {
  beat egg! // happens over and over
}

就像在食谱中一样,你不希望有人在时间结束之前做某个动作,所以你必须始终确保你的while循环有合理的停止条件。大多数while循环都依赖于循环内部的一些变化,当这些变化足够大时,它们就会停止。


第三个配方示例是for循环。对于你有(5)个洋葱,你对那个洋葱做一次操作。

for (onions 1 to 5) {
  Chop an onion! // done 5 times total, once per onion
}

while是一个循环结构,而不仅仅是if的另一种形式

var i = 0;
while ( i < 10 ) {
    //this stuff will happen until
    //i < 10
    // usually you iterate the counter so it
    // eventually breaks the loop because
    // i < 10 is no longer true
    i++;
}

这个和

的作用是一样的
for (var i = 0; i < 10; i++) {
    //this stuff will happen until
    //i < 10
}

良好的用例,而

一般来说,当需要进行的迭代次数已知时,使用for循环,所以通常当你对数组进行迭代并且你知道数组的长度时,for是一个很好的选择,因为你可以显式地设置迭代的次数。

while的一个更好的用例是当迭代的数量不是静态的(已知的)和/或您正在等待一个事件发生来打破循环。

while将继续运行,直到条件变为false。
如果在语句块结束时条件仍然为真,循环将重新运行。

if只运行一次

好吧,if statement不会循环回来。它只会发生一次,除非你把它放在一个循环中。只要语句仍然为真,while statement就会发生不止一次。

只要条件满足,while循环将一遍又一遍地执行,因为如果条件不改变,它将无限长。

当条件满足时,if将执行一次

如果你想创建一个无限循环一个while循环就可以了

var done=false;
while(!done){
    alert("I am annoying");
}

for语句可以用while来模拟:

for(var i=0; i<length; i++) {}
// is the same as
var i=0;
while(i<length) {
    // stuff
    i++;
}

也可用于以下循环:

while(true) {
    // stuff... (like waiting for user input, analyzing some data until
    // it hits a brick wall and needs to quit)
    if(some_condition) {
        break;
    }
}

或者其他内容:

while(a != b) {
    if(a > b) {
        a -= b;
    } else {
        b -= a;
    }
} // find the GCD of a and b

可以看到,它与if非常不同,并且解决了其他问题。