Cours alternatif d’OCaml

Logo OCaml
IV — Récursivité

Entraînement

Après ces deux petites pages, voici un quiz pour vous tester. Comme avant, les réponses deviennent vertes aussitôt qu’elles sont justes.

Sachant qu’on définit les types suivants :

type itineraire =
  | Arrive
  | Prendre of string * itineraire

type recette =
  | Degustation
  | Cuisson of int * recette (* le int correspond au temps de cuisson *)
  | Instruction of string * recette
  | PrendreIngredient of string * recette

Complétez ces fonctions récursives :

(* Donne une version lisible par un humain d’un itinéraire.
*
* Exemple :
*
* afficher(Prendre("rue des Mathématiques", Prendre("rue de la Physique", Arrive)))
* = "prendre la rue des Mathématiques, puis prendre la rue de la Physique, puis vous êtes arrivés."
*)
let rec afficher (i : itineraire) : string =
  match i with
  | Arrive -> "vous êtes arrivés."
  | ______(nom_route, suite) -> "prendre la " ^ nom_route ^ ", puis " ^ ______
(* Compte le nombre d’étapes d’une recette *)
let rec compter_etapes (r : recette) : int =
  match r with
  | PrendreIngredient(_, s) | Instruction(_, s) | Cuisson(_, s) -> ______
  | Degustation -> 0 (* La dégustation ne compte pas vraiment comme une étape *)
(* Fait la somme des temps de cuisson, au cas où il y en auraient plusieurs *)
let rec cuisson_total (r : recette) : int =
  match r with
  | ______ -> 0
  | Cuisson(temps, s) -> ______
  | Instruction(_, s) | PrendreIngredient(_, s) -> cuisson_total s

On veut écrire un type récursif pour modéliser une grotte, et ensuite écrire un algorithme pour trouver une sortie. On a donc trois types de « chemins » :

Complétez la définition du type somme correspondant.

type grotte =
  | ______
  | ______
  | ______ of ______

(* Sachant qu’on a ensuite cette fonction : *)
let fin_de_la_grotte (gro : grotte) : bool =
  match gro with
  | CulDeSac | Sortie -> true
  | Embranchement(_, _) -> false