Esistono fondamentalmente due tipi di cicli:
Entrambi sono possibili in Julia, anche se il secondo è probabilmente più comune.
while
Per problemi aperti, in cui non si sa in anticipo quante volte ripetere il ciclo, Julia mette a disposizione il ciclo while.
La forma di base è piuttosto semplice:
while condition
do_something()
end
In questo caso, il programma continua a ripetere il ciclo finché condition non è più true.
Ci sono due modi per uscire dal ciclo in anticipo:
break fa terminare il ciclo, e l'esecuzione riprende dalla riga successiva all'end del ciclo.return x interrompe l'esecuzione della funzione corrente, restituendo il valore x a chi l'ha chiamata.Con queste opzioni a disposizione, a volte può essere comodo creare un ciclo «infinito» con while true ... end, per poi affidarsi a una condizione di arresto trovata all'interno del corpo del ciclo che faccia scattare un break o un return.
L'esempio più semplice è iterare su un intervallo.
Se vogliamo fare qualcosa 10 volte:
for n in 1:10
do_something(n)
end
Se l'iterazione corrente non soddisfa una certa condizione, è possibile passare subito all'iterazione successiva con un continue:
for n in 1:10
if is_useless(n)
continue
end
# we decided this iteration could be useful
do_something_slow(n)
end
In una forma più breve, il blocco if si può sostituire con is_useless(n) && continue.
Si può iterare su molti altri tipi di collezione: gli elementi di un array, i caratteri di una stringa, le chiavi di un dizionario...
Gli esempi visti finora iterano sull'intervallo 1:10, dove il valore è anche l'indice del ciclo.
Più in generale, può servire l'indice e non solo il valore.
Per questo si usa la funzione eachindex(), ad esempio for i in eachindex(my_array) ... end.
La tua amica Li Mei gestisce un juice bar dove vende deliziosi succhi di frutta misti. Sei un cliente abituale del suo locale e ti sei reso conto che potresti rendere la vita più facile alla tua amica. Decidi di usare le tue competenze di programmazione per aiutare Li Mei con il suo lavoro.
A Li Mei piace dire in anticipo ai suoi clienti quanto devono aspettare per un succo del menù che hanno ordinato.
Fa fatica a ricordare i numeri esatti, perché il tempo necessario per preparare i succhi varia.
"Pure Strawberry Joy" impiega 0,5 minuti, "Energizer" e "Green Garden" impiegano 1,5 minuti ciascuno, "Tropical Island" impiega 3 minuti e "All or Nothing" impiega 5 minuti.
Per tutte le altre bevande (ad esempio le offerte speciali) puoi assumere un tempo di preparazione di 2,5 minuti.
Per aiutare la tua amica, scrivi una funzione time_to_mix_juice che prende come argomento un succo del menù e restituisce il numero di minuti necessari per preparare quella bevanda.
julia> time_to_mix_juice("Tropical Island")
3
julia> time_to_mix_juice("Berries & Lime")
2.5
Molte delle creazioni di Li Mei includono spicchi di lime, come ingrediente o come decorazione. Così, quando inizia il turno al mattino, deve assicurarsi che il contenitore degli spicchi di lime sia pieno per la giornata che la aspetta.
Implementa la funzione limes_to_cut, che prende il numero di spicchi di lime che Li Mei deve tagliare e un array che rappresenta la scorta di lime interi che ha a disposizione.
Può ricavare 6 spicchi da un lime "small", 8 spicchi da un lime "medium" e 10 da un lime "large".
Taglia sempre i lime nell'ordine in cui compaiono nella lista, iniziando dal primo elemento.
Continua finché non raggiunge il numero di spicchi che le serve o finché non finisce i lime.
Li Mei vorrebbe sapere in anticipo quanti lime deve tagliare.
La funzione limes_to_cut dovrebbe restituire il numero di lime da tagliare.
julia> limes_to_cut(25, ["small", "small", "large", "medium", "small"])
4
A Li Mei piace tenere traccia di quanto tempo ci vorrà per preparare gli ordini che i clienti stanno aspettando.
Implementa la funzione order_times, che prende una coda di ordini e restituisce un vettore di tempi di preparazione.
julia> order_times(["Energizer", "Tropical Island"])
[1.5, 3.0]
Li Mei lavora sempre fino alle 15. Poi il suo dipendente Dmitry prende il suo posto. Spesso, quando il turno di Li Mei finisce, ci sono bevande ordinate ma non ancora preparate. Dmitry preparerà poi i succhi rimanenti.
Per rendere più facile il passaggio di consegne, implementa una funzione remaining_orders che prende il numero di minuti rimanenti nel turno di Li Mei e un array di succhi ordinati ma non ancora preparati.
La funzione dovrebbe restituire gli ordini che Li Mei non può iniziare a preparare prima della fine della sua giornata lavorativa.
Il tempo rimanente nel turno sarà sempre maggiore di 0. L'array di succhi da preparare non sarà mai vuoto. Inoltre, gli ordini vengono preparati nell'ordine in cui compaiono nell'array. Se Li Mei inizia a preparare un certo succo, lo finirà sempre, anche se deve lavorare un po' più a lungo. Se non ci sono ordini rimanenti di cui Dmitry debba occuparsi, dovrebbe essere restituito un vettore vuoto.
julia> remaining_orders(5, ["Energizer", "All or Nothing", "Green Garden"])
["Green Garden"]
Iscriviti a Exercism per imparare e padroneggiare Julia con 35 concetti128 esercizi e il mentoring di persone reali, tutto gratis.