Matlab 教材:while 迴圈
這一節延續前一節 for-if-break 技術介紹 3x+1 問題
所討論的範例問題:3x+1 問題,有必要的話請先回去讀清楚。
凡是可以用 for 迴圈寫出來的程式,都可以改成 while 迴圈,反之亦然。
Matlab 也提供 while 迴圈語法,形如
while CONDITION
STATEMENTS;
end
其中 CONDITION 通常是一個邏輯計算,如有必要,請回頭看
[邏輯算子] 那一節。
執行的流程是
- 計算 CONDITION
- 如果 CONDITION 之結果是 False,則執行 end 之後的指令;
否則執行 STATEMENTS;
而 STATEMENTS; 就是一個或多個 Matlab 指令,
這些指令還可以包含其他的流程控制結構,例如 if, for 和 while 本身
- 執行到 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 那套語句了。
一開始,我們需要設定 x 和 n 的值,
然後 CONDITION 相當於要檢查「x 不等於 1 而且 n 不到 1000」。
因為我們不處理負數情形,所以「x 不等於 1」
是寫成 x>1 而不是寫成 x~=1。
然後,STATEMENTS; 基本上與 for 迴圈版本相同,只是刪除 if-break 語句,
而且要記得把 n 換成下一個整數,否則 n 永遠是 1 那麼
n<1000 這個條件就等於白說了。
最後提醒兩件事
- 既然 for 迴圈和 while 迴圈可以互換,那何必提供兩種語法?
原因有二:
- 風格問題,有人喜歡 for、有人喜歡 while
- for 迴圈通常用在事先已經確定要執行幾次的情形,
while 迴圈通常用在一邊計算一邊看看要不要繼續做的情形。
所以,嚴格說來,其實 3x+1 問題似乎比較適合用 while 迴圈。但是因為 Matlab
的 for 迴圈比較簡單而且常用,所以我們先介紹了 for 迴圈。
- 我們強調 CONDITION 「通常」是邏輯計算,
但是實際上它可以是任何會算出一個數值的語句。
如果 CONDITION 的計算結果是 0,則 while 認為 False。
只要不是 0,哪怕是 0.001 或者 -100 這種數,都是 True;
不一定要是 1 才代表 True。
習題
- 定義 Collatz 數列的「長度」為使得 xk=1 的最小 k。
令 x0 取值 3, 4, ..., 15,
哪一個 x0 導致的 Collatz 數列最長?有多長?
請用 while 迴圈寫程式作答。
(您可能要適度修改這一節展示的程式,讓它可以顯示 Collatz 數列的「長度」。)
- 不談風格問題,計算
適合用 for 還是 while?解釋您的原因。
- 不談風格問題,用牛頓法求
的根,預設容忍誤差是 5e-15 這種計算問題,適合用 for 還是 while?
解釋您的原因。
- 請用 while 迴圈寫程式,用牛頓法求
的根,預設容忍誤差是 5e-15。
- 不談風格問題,找到最小的正整數 k 使得
這種計算問題,適合用 for 還是 while?解釋您的原因。
- 請用 while 迴圈寫程式,找到最小的正整數 k 使得
單維彰 (2004/04/28) ---