不能写成 for 循环的 while 循环示例
Posted
技术标签:
【中文标题】不能写成 for 循环的 while 循环示例【英文标题】:Example of a while loop that can't be written as a for loop 【发布时间】:2010-12-03 14:49:16 【问题描述】:我知道while循环可以做for循环可以做的任何事情,但是for循环可以做while循环可以做的任何事情吗?
请举个例子。
【问题讨论】:
完全取决于编程语言。真正的 for 循环不能。 假设一种语言具有无限整数和“真正的 for 循环”,正如 Smasher 所说,并且正如每个引用 C 的人都误解了 - 更糟糕的是,我认为他们是认真的 - 考虑计算第一个大于给定整数 n 的素数。我知道如何使用while循环来做到这一点。你可以只用for循环吗? 通过使用短语“real for loop”,您可以构建一个重言式。 “真正的 for 循环”是一个残缺的 while 循环,因此能力较差,但您还没有从练习中学到任何东西。 顺便说一句——我想我可以用 for 循环解决下一个最大的主要问题,但它会非常低效。一个 for 循环到 n 以测试每个数字的素数并计算 P 是不超过 n 的所有素数的乘积。然后另一个从 n+1 到 P+1 的 for 循环来测试每个值的素数并保存最低值。休息可以使它更快,但是可选的。 @dmckee 我相信使用“真正的 for 循环”这个短语会使问题变得有趣。如果问题是关于写“for(;cond;)”那么就这样吧,那么我的评论就跑题了。但是,如果我相信这个问题是关于一个可以用 while 循环解决但不能用 for 循环解决的问题,我认为我的评论是正确的。 【参考方案1】:是的,很容易。
while (cond) S;
for(;cond;) S;
【讨论】:
我不妨补充一点,这适用于 C、C++、Java、C# 以及可能大量从 C 中大量借鉴的其他语言,但不适用于例如帕斯卡。 我喜欢这个答案的一点是,它同时证明了它是可以做到的,以及为什么这样做毫无意义。 我认为这根本不是一个完整的答案。在我看来,这个问题更像是一个舌头脸颊不屑一顾,尽管严格来说是正确的。【参考方案2】:while
循环和经典的for
循环可以互换:
for (initializer; loop-test; counting-expression)
…
initializer
while (loop-test)
…
counting-expression
【讨论】:
【参考方案3】:如果你有一个固定的边界和步骤,并且不允许修改循环体中的循环变量,那么 for 循环对应于原始递归函数。
从理论上讲,它们比一般的 while 循环弱,例如,您不能仅使用这种 for 循环来计算 Ackermann 函数。
如果您可以在 while 循环中为条件提供上限以使其变为真,则可以将其转换为 for 循环。这表明在实际意义上没有区别,因为您可以轻松提供天文数字的上限,比宇宙的寿命更长。
【讨论】:
【参考方案4】:使用 C
问题的基本前提是 while
循环可以重写为 for
循环。比如
init;
while (conditional)
statement;
modify;
被改写为;
for ( init; conditional; modify )
statements;
问题是基于 init
和 modify
语句被移动进入 for
循环,而for
循环不是只是,
init;
for (; conditional; )
modify;
但是,这是一个棘手的问题。这是不正确的,因为statements;
可以包含内部流控制。从C Programming: A Modern Approach, 2nd Edition你可以在第119页看到一个例子,
n = 0;
sum = 0;
while ( n < 10 )
scanf("%d", &i);
if ( i == 0 )
continue;
sum += i;
n++;
这不能重写为 for
之类的循环,
sum = 0;
for (n = 0; n < 10; n++ )
scanf("%d", &i);
if ( i == 0 )
continue;
sum += i;
为什么因为“当i
等于0
时,原始循环不会增加n
而新循环会增加。
这基本上归结为捕获,
while
循环内的显式流控制允许执行 for
循环(带有内部 init;
和 modify;
语句)无法重新创建。
【讨论】:
【参考方案5】:当循环迭代次数未知时,While 循环可能更有帮助,而当循环迭代次数已知时,for 循环更有效。 考虑以下代码 sn-p 用于学生成绩,但学生人数未知
ArrayList studentMarks = new ArrayList();
int score = 100;
int arraySize = 0;
int total = 0;
System.out.println("Enter student marks, when done press any number less than 0 0r greater than 100 to terminate entrancies\n");
while(score >= 0 && score < 101)
System.out.print("Enter mark : ");
score = scan.nextInt();
if(score < 0 | score > 100)
break;
studentMarks.add(score);
arraySize += 1;
// calculating total, average, maximum and the minimum values
for(int i=0;i<studentMarks.size();i++)
total += studentMarks.get(i);
System.out.println("Element at [" + (i+1)+"] : " +studentMarks.get(i));
System.out.println("Sum of list element is : " + total);
System.out.println("The average of the array list : " + (total/(studentMarks.size())));
Collections.sort(studentMarks);
System.out.println("The minimum of the element in the list is : " + studentMarks.get(0));
System.out.println("The maximum of the element in the list is : " + studentMarks.get(studentMarks.size()-1));
scan.close();
【讨论】:
【参考方案6】:While loop
没有for loop
那么多的灵活性,而且 for 循环比 while 循环更具可读性。我会用一个例子来证明我的观点。 for 循环可以有如下形式:
for(int i = 0, j = 0; i <= 10; i++, j++)
// Perform your operations here.
不能像上面的 for 循环那样使用 while 循环,如今大多数现代语言也允许使用 for each loop
。
在我看来,我可能会有偏见,请原谅,不应该使用while loop
,只要可以用for loop
编写相同的代码。
【讨论】:
你没有表现出灵活性,只是简洁。 for 循环更简洁。灵活性解决了它是否可以做得更多。【参考方案7】:在类 C 语言中,您可以像这样声明 for 循环:
for(; true;)
if(someCondition)
break;
在for
更严格的语言中,无限循环是需要while
循环的情况。
【讨论】:
以上是关于不能写成 for 循环的 while 循环示例的主要内容,如果未能解决你的问题,请参考以下文章