迴圈基本上分成兩種:
Julia 兩種都支援,不過第二種可能更常見。
while迴圈對於次數事先無法確定、沒有明確終點的問題,Julia 提供了while迴圈。
基本形式相當簡單:
while condition
do_something()
end
在這種情況下,程式會一直繞著迴圈執行,直到condition不再是true為止。
有兩種方式可以提早離開迴圈:
break會讓迴圈結束,並從迴圈end之後的下一行繼續執行。return x會停止目前函式的執行,並把回傳值x交還給呼叫方。有了這些選擇,有時候用while true ... end建立一個「無限」迴圈會很方便,接著只要在迴圈主體裡找到停止條件,就能觸發break或return。
最簡單的例子是走訪一段範圍。
如果我們想把某件事做 10 次:
for n in 1:10
do_something(n)
end
如果目前這一輪疊代不符合某個條件,可以用continue直接跳到下一輪疊代:
for n in 1:10
if is_useless(n)
continue
end
# we decided this iteration could be useful
do_something_slow(n)
end
寫得更精簡的話,這個if區塊可以換成is_useless(n) && continue。
還有許多其他型別的集合可以走訪:陣列裡的元素、字串裡的字元、字典裡的鍵……
到目前為止的例子都是走訪範圍1:10,其中的值同時也是迴圈索引。
更一般來說,我們可能需要索引,而不只是值。這時就要用eachindex()函式,例如for i in eachindex(my_array) ... end。
你的朋友 Li Mei 經營一家果汁吧,販售美味的綜合果汁。 你是她店裡的常客,也發現自己可以讓朋友的生活輕鬆一些。 你決定運用你的程式設計技能,幫 Li Mei 分擔她的工作。
Li Mei 喜歡事先告訴客人,他們從菜單上點的果汁需要等多久。
她很難記住確切的數字,因為每種果汁調製所需的時間都不一樣。
"Pure Strawberry Joy"需要 0.5 分鐘,"Energizer"和 "Green Garden"各需要 1.5 分鐘,"Tropical Island"需要 3 分鐘,而 "All or Nothing"需要 5 分鐘。
至於其他所有飲品(例如特價品),可以假設製作時間是 2.5 分鐘。
為了幫你的朋友,請寫一個 time_to_mix_juice 函式,它接受菜單上的一種果汁作為引數,並回傳調製該杯果汁所需的分鐘數。
julia> time_to_mix_juice("Tropical Island")
3
julia> time_to_mix_juice("Berries & Lime")
2.5
Li Mei 的許多作品都會用到萊姆角,不論是當作材料,還是作為裝飾的一部分。 所以每天早上開始上班時,她都得確認萊姆角盒是滿的,足以應付接下來的一天。
實作 limes_to_cut 函式,它接受 Li Mei 需要切的萊姆角數量,以及一個代表她手邊整顆萊姆存量的陣列。
一顆 "small" 萊姆可以切出 6 個萊姆角,一顆 "medium" 萊姆可以切出 8 個,一顆 "large" 萊姆則可以切出 10 個。
她總是照著清單中的順序切萊姆,從第一顆開始。
她會一直切下去,直到切足所需的萊姆角數量,或是萊姆用完為止。
Li Mei 想事先知道自己需要切幾顆萊姆。
limes_to_cut 函式應該回傳需要切的萊姆數量。
julia> limes_to_cut(25, ["small", "small", "large", "medium", "small"])
4
Li Mei 喜歡掌握顧客正在等待的訂單各需要多久的調製時間。
實作 order_times 函式,它接受一個訂單佇列,並回傳一個調製時間的向量。
julia> order_times(["Energizer", "Tropical Island"])
[1.5, 3.0]
Li Mei 總是工作到下午 3 點。 之後由她的員工 Dmitry 接手。 Li Mei 的班結束時,常常還有已經點好、但還沒調製的飲品。 Dmitry 會接著調製剩下的果汁。
為了讓交接更順利,請實作 remaining_orders 函式,它接受 Li Mei 這班剩下的分鐘數,以及一個裝著已點但還沒調製的果汁陣列。
這個函式應該回傳 Li Mei 在下班前無法開始調製的訂單。
這班剩下的時間永遠大於 0。 要調製的果汁陣列永遠不會是空的。 此外,訂單會按照它們在陣列中出現的順序調製。 如果 Li Mei 開始調製某杯果汁,即使得多工作一會兒,她也一定會把它調完。 如果沒有剩下任何需要 Dmitry 處理的訂單,則應回傳一個空向量。
julia> remaining_orders(5, ["Energizer", "All or Nothing", "Green Garden"])
["Green Garden"]