« INFO401 corr TD TP » : différence entre les versions
Aller à la navigation
Aller à la recherche
mAucun résumé des modifications |
|||
(62 versions intermédiaires par 11 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
=Préliminaires= |
|||
Pour afficher correctement dans le wiki, allez voir un peu comment on fait. Vous pouvez regarder par exemple sur le [[INFO401 | wiki du cours]] ou directement sur des articles de [http://fr.wikipedia.org/wiki/Accueil Wikipedia]. La documentation de mediawiki se trouve [http://meta.wikimedia.org/wiki/Aide:Éditeur ici]. |
|||
Un truc important : pour rentrer du code Caml, il faut mettre les balises <tt><nowiki><source lang="ocaml">...</source></nowiki>"</tt> autour de votre code. Allez par exemple voir le début de la section sur [[#Le TD1 et le TP0 | le TD1 et TP0]]. |
|||
Vous pouvez aller discuter des corrections dans les sujets de discussions associes... |
|||
=Le TD1 et le TP0= |
|||
Pour vous montrer un exemple de ce que j'attends, voila la correction de la fonction factorielle. (C'était facile...) J'ai volontairement mis beaucoup de commentaires... |
|||
<u>La fonction factorielle (TD1, exercice 2, question 2)</u> |
|||
Le but est de calculer la fonction <math>!n = 1\times2\times \cdots \times n</math> par récurrence. La version typée est verbeuse de la fonction correspondante en Caml donne : |
|||
<source lang="ocaml"> |
|||
(* fonction factorielle : c'est la factorielle habituelle des mathématiciens... *) |
|||
let rec fact (n:int) : int = |
|||
if (n>1) |
|||
then n * (fact (n-1)) |
|||
else 1 (* rq : pour que le programme ne boucle pas sur les valeurs négatives, on renvoie 1 dés que n<1 *) |
|||
</source> |
|||
Comme la fonction est récursive, il ne faut pas oublier le <tt>rec</tt> au début de la définition. |
|||
On aurait pu faire une autre version, qui fonctionne différemment sur les nombres négatifs : |
|||
<source lang="ocaml"> |
|||
let rec fact' = function |
|||
n when (n>0) -> n * fact' (n-1) |
|||
| n when (n<0) -> n * fact' (n+1) |
|||
| _ -> 1 (* si n n'est ni plus petit que 0 ni plus grand que 0, n est égal à 0, et on renvoie donc 1 *) |
|||
</source> |
|||
J'ai volontairement mis une version qui contient plusieurs choses que nous n'avons pas encore vues en cours : |
|||
* utilisation de "<tt>function</tt>" plutôt que <tt>fun</tt>, |
|||
* le symbole "<tt>|</tt>", |
|||
* le mot clé "<tt>when</tt>". |
|||
Vous devriez pouvoir comprendre ce que fait la fonction. Sinon, voici une version que vous auriez pu écrire : |
|||
<source lang="ocaml"> |
|||
let rec fact_bis = fun n -> |
|||
if (n=0) |
|||
then 1 |
|||
else begin |
|||
if (n>0) |
|||
then n*fact_bis (n-1) |
|||
else n*fact_bis (n+1) (* dans ce cas, n est forcement négatif *) |
|||
end |
|||
</source> |