C++ while語句

2023-09-08 14:31 更新

我們可以使用while語句重寫countdown函數(shù):

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

你幾乎可以像閱讀英語一樣閱讀while語句。這段代碼的含義是:當n大于0時,繼續(xù)顯示n的值,然后將n減少1;當n變?yōu)?時,輸出單詞“Blastoff!”。

while語句執(zhí)行流程的更正式的描述如下:

  1. 對括號內(nèi)的條件表達式求值,得到true或false;
  2. 如果條件為false,退出while語句,繼續(xù)執(zhí)行下一條語句;
  3. 如果條件為true,執(zhí)行花括號里的沒一條語句,然后回到第1步。

這類流程成為循環(huán),因為第3步會回到起點。注意,如果初次進入循環(huán)判斷條件為false,循環(huán)內(nèi)的語句將不會執(zhí)行。循環(huán)內(nèi)的語句成為循環(huán)體。

循環(huán)體應(yīng)改變一個或多個變量的值,使循環(huán)條件最終能變?yōu)閒alse,以結(jié)束循環(huán)。反之,循環(huán)將永遠反復(fù)執(zhí)行,這種情形稱為無限循環(huán)。本著娛樂無限的精神,計算機科學家發(fā)現(xiàn)下面這個洗發(fā)指導(dǎo)步驟是一個無限循環(huán):抹洗發(fā)水,清洗,然后重復(fù)。

在countdown這個例子中,我們可以證明循環(huán)會結(jié)束,因為已知n的值是有限的,而且我們看到n在每次循環(huán)(迭代)后都會減小,所以最終n的值會變?yōu)?。另外一個例子就不好說了:

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

循環(huán)條件是n!=1,因而循環(huán)將持續(xù)下去,直到n變?yōu)?,是條件為false。

每一次迭代,程序輸出n的值,然后檢查n是奇數(shù)還是偶數(shù);如果是偶數(shù),則n的值要除以2;如果是奇數(shù),則n的值用3n+1取代。舉個例子,如果循環(huán)初值(作為參數(shù)傳給sequence)為3,結(jié)果序列就是3、10、5、16、8、4、2、1。

由于n或增或減,并沒有明顯證據(jù)能證明n一定會變到1,或者說程序會結(jié)束。對于n的某些特定值,我們可以證明程序會結(jié)束。例如,如果初值是2的冪,則n的值每次循環(huán)結(jié)果都是偶數(shù),最終會變到1。前面的例子,初值是16,程序就在輸出一個序列后結(jié)束。

不考慮特定值,我們是否能證明程序?qū)τ趎的所有值都能結(jié)束?這個問題很有趣。到目前為止,沒有人能夠證明之,但也沒有人能推翻之!

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號