La capacità di una cosa di essere definita in termini di se stessa si chiama ricorsione. In F#, la ricorsione si trova più comunemente nelle funzioni ricorsive, cioè nelle funzioni che chiamano se stesse.
Una funzione ricorsiva deve avere almeno un caso base e almeno un caso ricorsivo. Un caso base restituisce un valore senza chiamare di nuovo la funzione. Un caso ricorsivo chiama di nuovo la funzione, modificando l'input in modo che a un certo punto corrisponda al caso base.
Le funzioni ricorsive si definiscono come le funzioni normali, ma con il modificatore rec. Senza questo modificatore, una funzione non sarà in grado di chiamare se stessa e qualsiasi tentativo di farlo produrrà un errore di compilazione. La ricorsione va quindi attivata esplicitamente.
let rec factorial x =
// Base case
if x = 1 then
1
// Recursive case
else
x * factorial (x - 1)
F# supporta anche i tipi ricorsivi tramite le unioni discriminate. In un'unione discriminata ricorsiva, uno o più dei suoi casi fanno riferimento al tipo unione discriminata stesso all'interno dei loro dati. Come le funzioni ricorsive, anche i tipi ricorsivi devono avere un caso base. A differenza delle funzioni ricorsive, però, i tipi ricorsivi non usano la parola chiave rec.
type RussianDoll =
| Doll // Base case
| Layer of RussianDoll // Recursive case
In questo esercizio lavorerai in una pizzeria che consegna ai clienti.
Offri tre tipi di pizza:
I clienti possono anche scegliere due opzioni aggiuntive a fronte di un piccolo costo extra:
Quando i clienti effettuano un ordine, viene aggiunto un costo aggiuntivo se ordinano solo una o due pizze:
Hai tre compiti, ognuno dei quali lavorerà con le pizze e il loro prezzo.
Definisci l'unione discriminata Pizza per rappresentare i tipi di pizza e le due opzioni aggiuntive che si possono aggiungere a una pizza:
MargheritaCapreseFormaggioExtraSauceExtraToppingsImplementa la funzione pizzaPrice per calcolare il prezzo di una pizza:
pizzaPrice Caprese
// => 9
Implementa la funzione orderPrice per calcolare il prezzo di un ordine di pizze:
orderPrice [Margherita; Formaggio]
// => 19
Iscriviti a Exercism per imparare e padroneggiare F# con 18 concetti148 esercizi e il mentoring di persone reali, tutto gratis.