不能写成 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;

问题是基于 initmodify 语句被移动进入 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 循环示例的主要内容,如果未能解决你的问题,请参考以下文章

Linux Shell:Shell循环语句

Verilog循环语句

Shell编程之循环语句

for / while / until 基础循环语句案例图解 shell编程之循环语句

for循环

使用while循环的简单示例