La capacidad de definir algo en términos de sí mismo se llama recursión. En F#, la recursión aparece sobre todo en las funciones recursivas, que son funciones que se llaman a sí mismas.
Una función recursiva necesita tener al menos un caso base y al menos un caso recursivo. Un caso base devuelve un valor sin volver a llamar a la función. Un caso recursivo vuelve a llamar a la función, modificando la entrada para que en algún momento coincida con el caso base.
Las funciones recursivas se definen como las funciones normales, pero con el modificador rec. Sin este modificador, una función no podrá llamarse a sí misma y cualquier intento de hacerlo dará lugar a un error de compilación. Por lo tanto, hay que optar explícitamente por la recursión.
let rec factorial x =
// Base case
if x = 1 then
1
// Recursive case
else
x * factorial (x - 1)
F# también admite tipos recursivos mediante tipos de unión discriminada. En un tipo de unión discriminada recursivo, uno o varios de sus casos hacen referencia al propio tipo de unión discriminada en sus datos. Al igual que las funciones recursivas, los tipos recursivos deben tener un caso base. A diferencia de las funciones recursivas, los tipos recursivos no usan la palabra clave rec.
type RussianDoll =
| Doll // Base case
| Layer of RussianDoll // Recursive case
En este ejercicio trabajas en una pizzería que reparte a domicilio.
Ofreces tres tipos de pizza:
Los clientes también pueden elegir dos opciones adicionales por un pequeño suplemento:
Cuando los clientes hacen un pedido, se añade un suplemento si solo piden una o dos pizzas:
Tienes tres tareas, cada una de las cuales trabajará con pizzas y su precio.
Define la unión discriminada Pizza para representar los tipos de pizza y las dos opciones adicionales que se pueden añadir a una pizza:
MargheritaCapreseFormaggioExtraSauceExtraToppingsImplementa la función pizzaPrice para calcular el precio de una pizza:
pizzaPrice Caprese
// => 9
Implementa la función orderPrice para calcular el precio del pedido de pizzas:
orderPrice [Margherita; Formaggio]
// => 19
Regístrate en Exercism para aprender y dominar F# con 18 conceptos148 ejercicios y mentoría humana real, todo gratis.