loop
與 while
迴圈在 Rust 中,迴圈是處理重複動作的重要工具。常見的迴圈有:
loop
:無窮迴圈(需要手動中止)while
:當條件為真時執行for
:針對範圍或可迭代項目本小節透過倒數秒數的實作練習,說明 loop
與 while
的使用差異與技巧。
loop
fn main() {
let mut seconds = 21;
loop {
if seconds <= 0 {
println!("Stop!");
break;
}
if seconds % 2 == 0 {
println!("{} seconds (even number), skipping 3seconds..", seconds);
seconds -= 3;
continue;
}
println!("Countdown {}!", seconds);
seconds -= 1;
}
}
元素 | 說明 |
---|---|
loop |
無條件重複執行,需要搭配 break 中止 |
break |
條件符合時(秒數小於等於 0)跳出迴圈 |
continue |
偶數秒跳過倒數、直接減 3 秒,進入下一輪迴圈 |
此模式讓你完全控制每次迴圈的流程與跳出時機。
while
fn main() {
let mut seconds = 21;
while seconds > 0 {
if seconds % 2 == 0 {
println!("{} seconds (even number), skipping 3seconds..", seconds);
seconds -= 3;
continue;
}
println!("Countdown {}!", seconds);
seconds -= 1;
}
}
元素 | 說明 |
---|---|
while |
先檢查條件(是否大於 0)再執行 |
continue |
同樣用於跳過此次迴圈,避免執行後續程式碼 |
相比 loop
,while
更適合用在條件式已知的情況,不需額外寫 break
。
loop
vs while
比較特性 | loop |
while |
---|---|---|
是否需條件 | ❌ 無(需手動中止) | ✅ 有條件控制 |
常見用途 | 無窮迴圈、條件複雜、需動態跳出 | 條件明確的迴圈 |
是否需 break |
✅ 通常需要 | ❌ 條件控制即可跳出 |
可讀性 | 較靈活、但需清楚流程邏輯 | 較簡潔,結構清楚 |
在程式設計中,遞迴 是指 函式呼叫自己本身 的行為。Rust 也支援遞迴,只要小心處理終止條件(base case),就可以避免無限呼叫造成程式崩潰。
fn countdown_number(seconds: i32) {
if seconds == 0 {
println!("Stop!")
} else {
println!("{} seconds to blastoff...", seconds);
countdown_number(seconds - 1);
}
}
fn main() {
countdown_number(5);
}
行數或區塊 | 說明 |
---|---|
fn countdown_number(seconds) |
宣告一個遞迴函式,參數為剩下的秒數 |
if seconds == 0 |
Base case:當秒數為 0 時結束遞迴 |
println!("Stop!") |
終止條件達成時,輸出 "Stop!" |
else 區塊 |
如果尚未倒數到 0,則顯示目前秒數並呼叫自己 |
countdown_number(seconds - 1) |
Recursive case:呼叫自己、秒數減一繼續倒數 |
fn main() |
主程式起始點,從 countdown_number(5) 開始執行 |
5 seconds to blastoff...
4 seconds to blastoff...
3 seconds to blastoff...
2 seconds to blastoff...
1 seconds to blastoff...
Stop!
遞迴若沒有終止條件(if seconds == 0),會造成無窮遞迴 → 堆疊溢位(stack overflow)
Rust 編譯器不會主動阻止你寫遞迴,但你需自行保證會有明確的終止條件
遞迴通常適合處理像是樹狀結構、演算法問題(如費波那契、階乘)等