7.1 while语句
可用 while 语句改写本书前面的 countdown 方法:
public static void countdown(int n) {while (n > 0) {System.out.println(n);n = n - 1;}System.out.println("Blastoff!");}
while 语句平白如话:只要 n 大于零,就打印 n 的值并将它减 1;n 为零后,打印“Blastoff!”。
括号内的表达式称为条件;而大括号内的语句称为循环体(loop body)。while 语句的执行流程如下。
(1) 计算条件,结果为 true 或 false。
(2) 如果条件为 false,就跳过循环体,接着执行循环体后面的语句。
(3) 如果条件为 true,就执行循环体,再回到第 1 步。
这种流程被称为循环(loop),因为执行完最后一步还会再回到第一步。
循环体应修改一个或多个变量的值,让条件最终为 false,从而结束循环。否则循环将没完没了地执行,这样的循环被称为无限循环(infinite loop)。计算机科学家总喜欢拿洗发水说明开涮,说其中的“抹洗发水、冲掉、再来”就是无限循环。
就前面的 countdown 方法而言,我们能够证明其中的循环肯定会结束。但一般而言,循环会不会结束并不那么容易判断。例如,下面的循环就会不断执行,直到 n 为 1(导致条件为 false):
public static void sequence(int n) {while (n != 1) {System.out.println(n);if (n % 2 == 0) { // n为偶数n = n / 2;} else { // n为奇数n = n * 3 + 1;}}}
每次执行循环时都会显示 n 的值,然后再检查它是奇数还是偶数。如果是偶数,就除以 2;如果是奇数,就将它设置为 3n+1。例如,如果起始值(传递给 sequence 的实参)为 3,将生成数列 3、10、5、16、8、4、2、1。
因为 n 时而增大时而减小,所以没有明显的证据可以证明 n 终将变成 1,从而导致这个程序终止。n 为某些值时,我们能够证明这个程序终将终止。例如,如果 n 的起始值为 2 的幂,则每次执行循环时,n 都将为偶数,并最终会变成 1。在前面的数列中,从 n 为 16 开始就是一个这样的数列。
不管 n 的初始值是多少,这个程序最终都将结束吗?这是一个难以回答的问题。到目前为止,既没人能够证明这一点,也没人能够证伪!更多详细信息请参阅 https://en.wikipedia.org/wiki/Collatz_conjecture。
