6.3 while语句

优质
小牛编辑
136浏览
2023-12-01

我们可以使用while语句重写countdown函数:

void countdown (int n) {
    while (n > 0) {
    cout << n << endl;
    n = n-1;
    }
    cout << "Blastoff!" << endl;
}

你几乎可以像阅读英语一样阅读while语句。这段代码的含义是:当n大于0时,继续显示n的值,然后将n减少1;当n变为0时,输出单词“Blastoff!”。

while语句执行流程的更正式的描述如下:

  1. 对括号内的条件表达式求值,得到true或false;
  2. 如果条件为false,退出while语句,继续执行下一条语句;
  3. 如果条件为true,执行花括号里的没一条语句,然后回到第1步。

这类流程成为循环,因为第3步会回到起点。注意,如果初次进入循环判断条件为false,循环内的语句将不会执行。循环内的语句成为循环体。

循环体应改变一个或多个变量的值,使循环条件最终能变为false,以结束循环。反之,循环将永远反复执行,这种情形称为无限循环。本着娱乐无限的精神,计算机科学家发现下面这个洗发指导步骤是一个无限循环:抹洗发水,清洗,然后重复。

在countdown这个例子中,我们可以证明循环会结束,因为已知n的值是有限的,而且我们看到n在每次循环(迭代)后都会减小,所以最终n的值会变为0。另外一个例子就不好说了:

void sequence (int n) {
    while (n != 1) {
        cout << n << endl;
        if (n%2 == 0) { // n为偶数
            n = n / 2;
        } else { // n为奇数
            n = n*3 + 1;
        }
    }
}

循环条件是n!=1,因而循环将持续下去,知道n变为1,是条件为false。

每一次迭代,程序输出n的值,然后检查n是奇数还是偶数;如果是偶数,则n的值要除以2;如果是奇数,则n的值用3n+1取代。举个例子,如果循环初值(作为参数传给sequence)为3,结果序列就是3、10、5、16、8、4、2、1。

由于n或增或减,并没有明显证据能证明n一定会变到1,或者说程序会结束。对于n的某些特定值,我们可以证明程序会结束。例如,如果初值是2的幂,则n的值每次循环结果都是偶数,最终会变到1。前面的例子,初值是16,程序就在输出一个序列后结束。

不考虑特定值,我们是否能证明程序对于n的所有值都能结束?这个问题很有趣。到目前为止,没有人能够证明之,但也没有人能推翻之!