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.
Il y a peut etre des choses qui sont incohérentes dans mon code, je ne suis pas familier avec la syntaxe.
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.
Edit: j'ai modifier mon code mais j'ai un stack overflow^^:
Mon problème viens du setq res....
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)))
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:
J'ai essayé nil mais comme ma fonction retourne des nombres ça marche pas.
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)))
Partager