La capacité d'une chose à se définir à partir d'elle-même s'appelle la récursion. En F#, la récursion se rencontre le plus souvent dans les fonctions récursives, c'est-à-dire des fonctions qui s'appellent elles-mêmes.
Une fonction récursive doit avoir au moins un cas de base et au moins un cas récursif. Un cas de base renvoie une valeur sans rappeler la fonction. Un cas récursif rappelle la fonction, en modifiant l'entrée pour qu'elle finisse par correspondre au cas de base.
Les fonctions récursives se définissent comme les fonctions classiques, mais avec le modificateur rec. Sans ce modificateur, une fonction ne pourra pas s'appeler elle-même, et toute tentative en ce sens provoquera une erreur de compilation. La récursion doit donc être activée explicitement.
let rec factorial x =
// Base case
if x = 1 then
1
// Recursive case
else
x * factorial (x - 1)
F# prend également en charge les types récursifs, via les types d'union discriminée. Dans un type d'union discriminée récursif, un ou plusieurs de ses cas font référence au type d'union discriminée lui-même dans leurs données. Comme les fonctions récursives, les types récursifs doivent avoir un cas de base. Contrairement aux fonctions récursives, les types récursifs n'utilisent pas le mot-clé rec.
type RussianDoll =
| Doll // Base case
| Layer of RussianDoll // Recursive case
Dans cet exercice, on travaille dans une pizzeria qui livre ses clients.
On propose trois types de pizzas :
Les clients peuvent aussi choisir deux options supplémentaires pour un petit supplément :
Lorsqu'un client passe une commande, des frais supplémentaires s'ajoutent s'il ne commande qu'une ou deux pizzas :
Tu as trois tâches à réaliser, chacune portant sur des pizzas et leur prix.
Définis l'union discriminée Pizza pour représenter les types de pizzas et les deux options supplémentaires que l'on peut ajouter à une pizza :
MargheritaCapreseFormaggioExtraSauceExtraToppingsImplémente la fonction pizzaPrice pour calculer le prix d'une pizza :
pizzaPrice Caprese
// => 9
Implémente la fonction orderPrice pour calculer le prix d'une commande de pizzas :
orderPrice [Margherita; Formaggio]
// => 19
Inscris-toi sur Exercism pour apprendre et maîtriser F# avec 18 concepts148 exercices, et un vrai mentorat humain, le tout gratuitement.