使用while循环的简单示例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用while循环的简单示例相关的知识,希望对你有一定的参考价值。

我正在尝试编写一些示例来解释何时应该使用while循环,以及何时应该使用for循环。

在寻找有趣的案例来展示年轻和新手程序员时,我意识到while循环的绝大多数教科书示例都是这样的:

i = 0
while i < 10:
    do something
    i = i + 1

'做某事'可能会打印奇数,平方我等等......然而所有这些显然更容易用for循环编写!

我正在寻找更有趣的例子。他们必须是:

  1. 适合年轻的程序员(例如,没有太多的数学,如数字根发现或Collat​​z猜想中的序列)
  2. 使用while循环而不是for循环更容易(或更直观)解决。
  3. 有一些真正的用途(例如,我可以做while random() < 0.95,但这是真正的用途?)

我能想到的唯一例子是从用户逐个获取列表输入(例如,要求求和的数字),但是用户必须使用特殊输入来终止它,并且这似乎毫无意义用户可以提前说出序列中将有多少条目。

答案

FOR循环和WHILE循环之间的根本区别在于,对于FOR循环,迭代次数由循环开始之前已知的常数限定,而对于WHILE循环,迭代次数可以是无界的,未知的,或无限的。

因此,只提供WHILE循环的语言是Turing-complete,只提供FOR循环的语言不是。

因此,只有WHILE循环可以做的第一个显而易见的事情是无限循环。容易建模为无限循环的东西,例如,Web服务器,Netflix客户端,游戏循环,GUI事件循环或操作系统:

WHILE (r = nextHttpRequest):
    handle(r)
END

WHILE (p = nextVideoStreamPacket):
    frame = decode(p)
    draw(frame)
END

WHILE (a = playerAction):
    computeNextFrame(a)
END

WHILE (e = nextEvent):
    handle(e)
END

WHILE (s = sysCall):
    process(s)
END

循环不是无限的一个很好的例子,但是事先不知道边界(正如你在你的问题中已经提到的那样)要求用户输入。像这样的东西:

WHILE (askBoolean("Do you want to play again?")):
    playGame()
END

另一个很好的例子是处理类似C的字符串,其中字符串的长度未知但有限。对于链表,或者对于存在“next”概念但没有“size”概念的任何数据结构,这是相同的情况,而是有一些标记结束的标记值(例如,NUL终止的字符串)在C)或检查是否有下一个元素的方法(例如Java中的Iterator):

WHILE ((element = getNext()) != END_MARKER):
    process(element)
END

WHILE (hasNextElement):
    process(getNext())
END

还有一些情况可以使用FOR循环处理,但WHILE循环更优雅。我能想到的一种情况是,迭代次数的界限是事先知道的,它是常数,但是已知的界限非常大,并且所需的实际迭代次数明显小于界限。

不幸的是,我无法想出一个很好的现实生活中的例子,也许别人可以。然后,FOR循环通常如下所示,以便跳过从实际迭代次数到上限的迭代:

FOR (i FROM 1 TO $SOME_LARGE_UPPER_BOUND):
    IF (terminationConditionReached):
        NOOP()
    ELSE:
        doSomethingInteresting()
    END
END

哪个更好地表达为

WHILE (NOT terminationConditionReached):
    doSomethingInteresting()
END

在这种情况下使用FOR循环可能有意义,如果i的值是有意义的:

FOR (i FROM 1 TO $SOME_LARGE_UPPER_BOUND):
    IF (terminationConditionReached):
        NOOP()
    ELSE:
        doSomethingInterestingWithI(i)
    END
END

我能想到的最后一种情况,即WHILE循环比FOR循环更合适,即使迭代次数受已知常量限制,如果该常量对于循环不是“语义上有趣的”。

例如,Tic-Tac-Toe的游戏循环最多只需要9次移动,因此可以将其建模为FOR循环:

FOR (i FROM 1 TO 9):
    IF (player1Won OR player2Won):
        NOOP
    ELSE:
        makeMove()
    END
END

但是,数字“9”在这里并不是很有趣。一个玩家是否拥有一个或者棋盘是满的,这个更有趣:

WHILE (NOT (player1Won OR player2Won OR boardFull)):
    makeMove()
END

[注意:至少如果与孩子比赛,这也是倒数第二种情况的一个例子,即上限已知为9,但很多游戏将比9次移动短。但是,我仍然希望找到一个例子,这也不是一个语义上不感兴趣的终止条件的例子。

因此,我们在这里有两类情况:一类,其中FOR循环根本无法使用(当绑定未知,不存在或无限时),以及一个可以使用FOR循环的情况,但是WHILE循环更有意思揭露。

以上是关于使用while循环的简单示例的主要内容,如果未能解决你的问题,请参考以下文章

流程控制之while循环

使用While循环导出Excel

DB2 存储过程简单示例

浅谈java中循环结构之一——————while的简单应用

IT兄弟连 Java语法教程 流程控制语句 循环结构语句3

如何在微控制器按钮上使while循环更快?