C++ while語(yǔ)句

2023-09-08 14:31 更新

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

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

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

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

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

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

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

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

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取代。舉個(gè)例子,如果循環(huán)初值(作為參數(shù)傳給sequence)為3,結(jié)果序列就是3、10、5、16、8、4、2、1。

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

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)