La capacidad de que algo se defina en términos de sí mismo se llama recursión. En F#, la recursión se encuentra más comúnmente 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á como resultado un error de compilación. Por eso, la recursión hay que habilitarla de forma explícita.
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. Un tipo de unión discriminada recursivo tiene uno o más de sus casos que 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 hace entregas a domicilio.
Ofreces tres tipos de pizza:
Los clientes también pueden elegir dos opciones adicionales por un pequeño cargo extra:
Cuando los clientes hacen un pedido, se agrega un cargo adicional si solo piden una o dos pizzas:
Tienes tres tareas, y cada una trabaja 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 agregar 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 de un 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.