Compter les mots acceptés
Exercice · OCaml (option informatique), chapitre 18 — Automates finis
Énoncé
Écrire compte_mots a longueur : le nombre de mots de longueur exactement longueur acceptés par a.
Corrigé
let compte_mots a longueur =
let nb_sym = Array.length a.delta.(0) in
let nb = Array.make a.nb_etats 0 in
nb.(a.initial) <- 1;
for _i = 1 to longueur do
let suivant = Array.make a.nb_etats 0 in
for e = 0 to a.nb_etats - 1 do
for s = 0 to nb_sym - 1 do
let e' = a.delta.(e).(s) in
suivant.(e') <- suivant.(e') + nb.(e)
done
done;
for e = 0 to a.nb_etats - 1 do nb.(e) <- suivant.(e) done
done;
let total = ref 0 in
for e = 0 to a.nb_etats - 1 do
if a.acceptants.(e) then total := !total + nb.(e)
done;
!total
Programmation dynamique (chapitre 13) sur les états : nb.(e) compte les mots (de la longueur courante) menant à l'état e. À chaque lettre lue, on propage ces comptes le long des transitions. À la fin, on somme sur les états acceptants. Coût — sans énumérer les mots un à un.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.