Bonjour,

Je suis nouveau en lisp et j'aime pas du tout la récursivité.

J'essaye de faire une fonction qui me retourne le nombre le plus grand dans une liste.

Voici mon code.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
(defun max (list) ;creation de la fonction max
(if (null list) ;si ma liste est vide je retoune null
null)
(if (> (setq res (max (cdr list))) (car list))
res))  ;je recupère la valeur que me renvoie max et la compare avec la valeur actuel "car" de ma liste si elle est plus grande je retourne cette valeur. J'essaye de stocker cette valeur dans res avec setq, je ne sais pas si c'est possible.
Il y a peut etre des choses qui sont incohérentes dans mon code, je ne suis pas familier avec la syntaxe.

Edit: j'ai modifier mon code mais j'ai un stack overflow^^:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
(defun maxe (list)
(if (null list)
nil)
(setq res (maxe (cdr list)))
(if (nil res)
(car list)
(if (> res (car list))
res)))
Mon problème viens du setq res....
Je pensais que mettre le nil signifiait (return null) en C par exemple. Mais au lieu de s'arreter le programme continue.

Edit 2:

Ca marchotte mais le problème c'est que lorsque j'arrive à la fin de la liste je voudrais retourné autre chose qu'un nombre pour dire que c'est la fin, sinon si dans la liste il y a le nombre ça arrêtera la récursivité trop tot:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
(defun maxe (list)
(if (null list)
(return-from maxe 1))
(princ (car list))
(setq res (maxe (cdr list)))
(if (= res 1)
(car list))
(if (> res (car list))
res
(car list)))
J'ai essayé nil mais comme ma fonction retourne des nombres ça marche pas.