使用while循环的简单示例
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用while循环的简单示例相关的知识,希望对你有一定的参考价值。
我正在尝试编写一些示例来解释何时应该使用while循环,以及何时应该使用for循环。
在寻找有趣的案例来展示年轻和新手程序员时,我意识到while循环的绝大多数教科书示例都是这样的:
i = 0
while i < 10:
do something
i = i + 1
'做某事'可能会打印奇数,平方我等等......然而所有这些显然更容易用for循环编写!
我正在寻找更有趣的例子。他们必须是:
- 适合年轻的程序员(例如,没有太多的数学,如数字根发现或Collatz猜想中的序列)
- 使用while循环而不是for循环更容易(或更直观)解决。
- 有一些真正的用途(例如,我可以做
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循环的简单示例的主要内容,如果未能解决你的问题,请参考以下文章