Matlab 教材:while 迴圈

這一節延續前一節 for-if-break 技術介紹 3x+1 問題 所討論的範例問題:3x+1 問題,有必要的話請先回去讀清楚。

凡是可以用 for 迴圈寫出來的程式,都可以改成 while 迴圈,反之亦然。 Matlab 也提供 while 迴圈語法,形如

while CONDITION
    STATEMENTS;
end
其中 CONDITION 通常是一個邏輯計算,如有必要,請回頭看 [邏輯算子] 那一節。 執行的流程是
  1. 計算 CONDITION
  2. 如果 CONDITION 之結果是 False,則執行 end 之後的指令; 否則執行 STATEMENTS; 而 STATEMENTS; 就是一個或多個 Matlab 指令, 這些指令還可以包含其他的流程控制結構,例如 if, for 和 while 本身
  3. 執行到 end 時,回到 1.
為了避免 CONDITION 永遠 True (不是 False 就是 True), 在 STATEMENTS; 之中,總得有一句話是可能會改變 CONDITION 的。

前一節程式的最後版本如下

x = 3;
for n=1:1000
    if (rem(x,2))
        x = 3*x+1
    else
        x = x/2
    end
    pause(1);
    if (x == 1)
        break;
    end
end
它原來採用 for 迴圈,我們現在將它改成使用 while 迴圈:
x = 3;
n=0;
while (x>1) & (n<1000)
    n = n+1;
    if (rem(x,2))
        x = 3*x+1
    else
        x = x/2
    end
    pause(1);
end
重要的差異在於,我們不需要 if-break 那套語句了。 一開始,我們需要設定 xn 的值, 然後 CONDITION 相當於要檢查「x 不等於 1 而且 n 不到 1000」。 因為我們不處理負數情形,所以「x 不等於 1」 是寫成 x>1 而不是寫成 x~=1。 然後,STATEMENTS; 基本上與 for 迴圈版本相同,只是刪除 if-break 語句, 而且要記得把 n 換成下一個整數,否則 n 永遠是 1 那麼 n<1000 這個條件就等於白說了。

最後提醒兩件事

  1. 既然 for 迴圈和 while 迴圈可以互換,那何必提供兩種語法? 原因有二:
    1. 風格問題,有人喜歡 for、有人喜歡 while
    2. for 迴圈通常用在事先已經確定要執行幾次的情形, while 迴圈通常用在一邊計算一邊看看要不要繼續做的情形。
    所以,嚴格說來,其實 3x+1 問題似乎比較適合用 while 迴圈。但是因為 Matlab 的 for 迴圈比較簡單而且常用,所以我們先介紹了 for 迴圈。
  2. 我們強調 CONDITION 「通常」是邏輯計算, 但是實際上它可以是任何會算出一個數值的語句。 如果 CONDITION 的計算結果是 0,則 while 認為 False。 只要不是 0,哪怕是 0.001 或者 -100 這種數,都是 True; 不一定要是 1 才代表 True。

習題

  1. 定義 Collatz 數列的「長度」為使得 xk=1 的最小 k。 令 x0 取值 3, 4, ..., 15, 哪一個 x0 導致的 Collatz 數列最長?有多長? 請用 while 迴圈寫程式作答。 (您可能要適度修改這一節展示的程式,讓它可以顯示 Collatz 數列的「長度」。)
  2. 不談風格問題,計算

    適合用 for 還是 while?解釋您的原因。
  3. 不談風格問題,用牛頓法求
    \begin{displaymath} f(x) = \tan x - \cos x \end{displaymath}

    的根,預設容忍誤差是 5e-15 這種計算問題,適合用 for 還是 while? 解釋您的原因。
  4. 請用 while 迴圈寫程式,用牛頓法求
    \begin{displaymath} f(x) = \tan x - \cos x \end{displaymath}

    的根,預設容忍誤差是 5e-15。
  5. 不談風格問題,找到最小的正整數 k 使得
    \begin{displaymath}
\vert 1 + \frac1{2^4} + \frac1{3^4} + \cdots + \frac1{k^4} - \frac{\pi^4}{90} \v
ert
\leq 5\times 10^{-12} \end{displaymath}

    這種計算問題,適合用 for 還是 while?解釋您的原因。
  6. 請用 while 迴圈寫程式,找到最小的正整數 k 使得
    \begin{displaymath}
\vert 1 + \frac1{2^4} + \frac1{3^4} + \cdots + \frac1{k^4} - \frac{\pi^4}{90} \v
ert
\leq 5\times 10^{-12} \end{displaymath}

單維彰 (2004/04/28) --- [Prev] [Next] [Up]