Tu vas avoir du mal à trouver ton erreur, ton code est trop noyé. On peut faire un peu de ménage pour commencer.
Tout d'abord, ne vérifie pas la validité des arguments, on l'ajoutera plus tard. Ensuite pour les personnes, je te propose un type plus adéquat qui nous évitera des erreurs d’inattention :
type personne = Alive | Dead of int
Ainsi Alive est une constante du type personne et Dead 5 est aussi une personne (ce qui signifie que cette personne est morte la cinquième).
Continuons. Dans l'exercice, il te faut parcourir en boucle la ronde formée par les futur suicidés. Tu n'as aucune raison d'imbriquer deux boucles, ta première version était bonne.
Encore un « truc » : la fonction incr. Elle prend une int ref et l'incrémente. Elle est définie à peu près ainsi :
1 2
| let incr intref =
intref := !intref + 1 |
La fonction decr existe aussi et fait ce qu'on attend d'elle.
Conseil algorithmique. Ne perds pas ton temps à remplir le tableau résultat pendant le calcul, tu mélanges deux choses distinctes (calcul et présentation du résultat) et rends ton code plus difficile à suivre. Dans un premier temps (une fonction à part ?) aide ces braves juifs à se suicider et ensuite seulement récupère l'ordre dans lequel ils ont trépassé. Astuce : pour savoir dans quelle position se trouve la personne #i (où ronde est le tableau de personnes) :
1 2 3 4
| let get_dead_order ronde i =
match ronde.(i) with
| Dead n -> n
| Alive -> failwith("Ceci ne devrais pas arriver.\n") |
Partager