Jamy > est-ce que tu as déjà de l'expérience avec des langages type Lisp ? La notion de car et coulder/cdr (x:xs) pourrait déjà t'aider à comprendre.
Si tu veux un peu d'aide sur la récursion, regarde le bouquin The Little Schemer, qui présente des aspects fascinants de la récursion avec Scheme. Attention à la fin c'est costaud, on passe d'un bête tri de liste récursif à des démonstrations mathématiques complètes
Sinon pour ton algo :
"maximum' :: (Ord a) => [a] -> a "
Signature de la fonction : elle prends une liste d'élément de type a où a est un type ordonnable et renvoie un élément de type a.
"maximum' [] = error "maximum of empty list"
En Haskell on peut faire des 'surcharges' de fonctions instantanées selon le type et la taille des arguments. Ici, in lance une erreur si la liste est vide.
"maximum' [x] = x "
On renvoie x si la liste ne contient qu'x.
"maximum' (x:xs) "
Si on tombe ici, c'est qu'on a une liste d'au moins 2 atoms. On les sépare en deux, le car (x) et le cdr (xs). Le car est la tête de liste (premier élément), le cdr le reste.
C'est ici que ça devient intéressant (mais encore assez simple à suivre, on a pas de construction à faire lorsque le fil de récursion est 'rappelé'). Je remplace les variables locales pour plus de clarté.
" | x > maximum' xs = x "
Si la tête de liste est supérieure au maximum du reste de la liste, alors la réponse est la tête de liste.
Exemple avec [3,1,2]. On compare 3 et [1,2]. On appelle donc maximum' sur [1,2] et on cherche à comparer 1 et 2. 1 est inférieur à deux, on passe au garde 'otherwise'. Cette fois-ci, le reste de la liste est seulement 2, donc on relance maximum', mais on tombe dans le cas maximum' [x] et donc on renvoit x, ici 2.
Hop, plus rien à faire ! On remonte le tas récursif. On a obtenu 2 en réponse à la première question qui voulait le comparer avec maximum' xs. Maintenant il faut faire une comparaison 3 > 2, ce qui est vrai. On reste bien dans le premier garde (on y était seulement entré avant de voir qu'il fallait d'autres appels récursifs pour y répondre) et donc on renvoit x, donc 3.
3 est bien le maximum de [3,1,2] 