A capacidade de algo ser definido em termos de si mesmo chama-se recursão. Em F#, a recursão aparece mais frequentemente em funções recursivas, que são funções que se chamam a si próprias.
Uma função recursiva tem de ter pelo menos um caso base e pelo menos um caso recursivo. Um caso base devolve um valor sem voltar a chamar a função. Um caso recursivo volta a chamar a função, modificando o valor de entrada para que, em algum momento, este corresponda ao caso base.
As funções recursivas definem-se como as funções normais, mas com o modificador rec. Sem este modificador, uma função não consegue chamar-se a si própria e qualquer tentativa de o fazer resultará num erro de compilação. Por isso, é preciso optar explicitamente pela recursão.
let rec factorial x =
// Base case
if x = 1 then
1
// Recursive case
else
x * factorial (x - 1)
F# também suporta tipos recursivos através de tipos de união discriminada. Um tipo de união discriminada recursivo tem um ou mais casos que se referem ao próprio tipo de união discriminada nos seus dados. Tal como as funções recursivas, os tipos recursivos têm de ter um caso base. Ao contrário das funções recursivas, os tipos recursivos não usam a palavra-chave rec.
type RussianDoll =
| Doll // Base case
| Layer of RussianDoll // Recursive case
Neste exercício, trabalhas numa pizzaria que faz entregas ao domicílio.
Ofereces três tipos de pizza:
Os clientes podem também escolher duas opções adicionais por um pequeno custo extra:
Quando os clientes fazem uma encomenda, é acrescentada uma taxa adicional se encomendarem apenas uma ou duas pizzas:
Tens três tarefas, cada uma delas sobre pizzas e o seu preço.
Define a união discriminada Pizza para representar os tipos de pizza e as duas opções adicionais que podem ser acrescentadas a uma pizza:
MargheritaCapreseFormaggioExtraSauceExtraToppingsImplementa a função pizzaPrice para calcular o preço de uma pizza:
pizzaPrice Caprese
// => 9
Implementa a função orderPrice para calcular o preço de uma encomenda de pizzas:
orderPrice [Margherita; Formaggio]
// => 19
Inscreve-te no Exercism para aprenderes e dominares F# com 18 conceitos148 exercícios, e mentoria humana real, tudo grátis.