Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

巢狀迴圈

本集目標

把迴圈放進迴圈裡——用巢狀迴圈印出九九乘法表。

正文

上一集學了 for 迴圈,今天來玩個進階的——把一個迴圈放進另一個迴圈裡面

什麼是巢狀迴圈?

「巢狀」就是「一層包一層」的意思,像俄羅斯套娃一樣。外面的迴圈跑一次,裡面的迴圈就會完整跑完一輪。

九九乘法表

來挑戰一下,用巢狀迴圈印出九九乘法表:

fn main() {
    for i in 1..=9 {
        for j in 1..=9 {
            print!("{} x {} = {}   ", i, j, i * j);
        }
        println!(); // 換行
    }
}

它是怎麼運作的?

  1. 外面的迴圈 i 從 1 跑到 9
  2. i = 1 時,裡面的迴圈 j 從 1 跑到 9 → 印出 1×1, 1×2, … 1×9
  3. 裡面的迴圈跑完後,println!() 換行
  4. 外面的迴圈走到 i = 2,裡面的迴圈又從 1 跑到 9 → 印出 2×1, 2×2, … 2×9
  5. 以此類推……

這裡用了一個新東西:print!。它跟 println! 很像,差別在於 print! 印完不會換行,而 println! 印完會換行。

視覺化

外迴圈跑一次 = 一行:

i=1 → [j=1, j=2, j=3, ... j=9] → 換行
i=2 → [j=1, j=2, j=3, ... j=9] → 換行
...
i=9 → [j=1, j=2, j=3, ... j=9] → 換行

break 只跳出最內層

在巢狀迴圈裡用 break,它只會跳出最裡面那一層迴圈,外面那層還會繼續跑:

fn main() {
    for i in 1..=3 {
        for j in 1..=3 {
            if j == 2 {
                break; // 只跳出內層迴圈
            }
            println!("i={}, j={}", i, j);
        }
    }
}

每次 j 到 2 就 break 了,但外層的 i 還是繼續跑 1、2、3。

loop label:跳出指定層

如果你想直接跳出外面那層呢?可以用 loop label

fn main() {
    'outer: for i in 1..=3 {
        for j in 1..=3 {
            if j == 2 {
                break 'outer; // 跳出外層迴圈
            }
            println!("i={}, j={}", i, j);
        }
    }
    println!("結束!");
}

'outer: 是一個標籤(label),放在迴圈前面。break 'outer 就是說「跳出標記為 'outer 的那個迴圈」。注意標籤名稱前面要加 '(單引號)。

重點整理

  • 巢狀迴圈就是迴圈裡面再放迴圈,外層跑一次、內層就完整跑一輪
  • print!println! 的差別:print! 印完不換行
  • break 在巢狀迴圈裡只會跳出最內層的迴圈
  • 用 loop label('outer: + break 'outer)可以跳出指定的外層迴圈