企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
我们可以使用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的所有值都能结束?这个问题很有趣。到目前为止,没有人能够证明之,但也没有人能推翻之!