循環式控制流

熟悉了me物件的功能後,我們將用目前它的前進右轉功能,來執行一些任務,想像一下讓它進行這樣的移動:

//  (0,0)
// ➙(0,4)  前進四步
// ➙(1,4)  右轉,並且前進一步
// ➙(1,0)  右轉,並且前進四步
// ➙(2,0)  左轉,並且前進一步

你或許會寫出這樣子的程式碼:

.前進().前進().前進().前進()  // 前進四步,到達 (0,4).右轉()  // 轉向東方 (x軸正向).前進()  // 到達 (1,4).右轉()  // 轉向南方 (y軸負向).前進().前進().前進().前進()  // 前進四步,到達 (1,0)  .右轉().右轉().右轉()  // 右轉三次等於左轉,面向東方 (x軸正向).前進()  // 到達 (2,0)

執行起來是沒有問題的!你將會看到系統不斷印出的行動,最後成功到達了我們期待的座標(2,0)。但是僅僅是如此簡單的命令就消耗了我們 15 行的程式碼,如果今天要前進 100 步,難道真的得寫 100 行我.前進()才行嗎?

這當然是不可能的!電腦最擅長的事情之一,就是接收簡單的指令,並且不斷執行同樣的動作,這也是本章的重點,我們將介紹幾種不同的「迴圈」寫法,迴圈的直觀意義就是「在某個條件下,不斷地執行這個圈圈裡的指令。」

for a in 1...10 {
    print(a)
}
// 試試看執行結果,猜測一下這段程式碼的功能?

for-in迴圈是基礎的迴圈之一,這段程式碼的意義是:讓電腦知道有個整數資料a,並且開始執行{}包裹的程式碼,對於每個在110中間的整數,迴圈都會完整執行完一次,執行時a的值分別等於123...10。如果我們不需要a的值,也可以用底線代替,如下:

for _ in 1...10 {
    print("Hello!") 
}
// 這段程式碼會印出 10 次 Hello!

現在,請執行一個任務,讓我們開始時使用的me物件,順時針繞著一個邊長是 5 的正方形走一圈。

for _ in 1...5 {.前進()
}.右轉()

for _ in 1...5 {.前進()
}.右轉()

for _ in 1...5 {.前進()
}.右轉()

for _ in 1...5 {.前進()
}.右轉()

非常正確的程式碼,執行起來也沒有問題,以走五步為單位繞行了一週後,回到了原點(0,0),構成一個正方形。但正如我們將「走五步」這個「重複的動作」封裝在for-in迴圈之中一樣,或許你會注意到:除了前進這個動作重複了五次以外,「走五步後右轉」這個動作也重複了四次,我們應該也可以將它封裝在for-in迴圈之中才對!

for b in 1...4 {
    for a in 1...5 {.前進()
    }.右轉()
}

電腦在進行這樣的指令的時候,首先試圖拆開最裡面的{}包裹的程式碼(即是使用a的迴圈),了解到前進這個動作是要進行五次的;隨後才拆開較外面的{}包裹的程式碼(即是使用b的迴圈),了解到「前進五次後右轉」這個動作要進行四次,之後正確的執行了包含 20 個前進和 4 個右轉這 24 條指令,卻只需要 6 行就寫完了!這樣的技巧稱做「巢狀迴圈」

試著自己組合一下目前為止學過的技巧,印出一個九九乘法表!

results matching ""

    No results matching ""