iT邦幫忙

0

二、三天學一點點 Rust:來!loop、while loop、recursion(16)

  • 分享至 

  • xImage
  •  

🦀 loopwhile 迴圈

在 Rust 中,迴圈是處理重複動作的重要工具。常見的迴圈有:

  • loop:無窮迴圈(需要手動中止)
  • while:當條件為真時執行
  • for:針對範圍或可迭代項目

本小節透過倒數秒數的實作練習,說明 loopwhile 的使用差異與技巧。


🔁 練習一:使用 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 同樣用於跳過此次迴圈,避免執行後續程式碼

相比 loopwhile 更適合用在條件式已知的情況,不需額外寫 break


🆚 loop vs while 比較

特性 loop while
是否需條件 ❌ 無(需手動中止) ✅ 有條件控制
常見用途 無窮迴圈、條件複雜、需動態跳出 條件明確的迴圈
是否需 break ✅ 通常需要 ❌ 條件控制即可跳出
可讀性 較靈活、但需清楚流程邏輯 較簡潔,結構清楚

🦀 遞迴函式

📘 什麼是遞迴(Recursion)?

在程式設計中,遞迴 是指 函式呼叫自己本身 的行為。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) 開始執行

✅ 執行結果: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 編譯器不會主動阻止你寫遞迴,但你需自行保證會有明確的終止條件

  • 遞迴通常適合處理像是樹狀結構、演算法問題(如費波那契、階乘)等


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言