Renvoie la plus longue séquence de nombres consécutifs de la liste en lisp
Je suis un débutant en lisp. J'essaie de créer une fonction en lisp qui reçoit une liste non triée et la fonction doit trier la liste et renvoyer une liste avec la plus longue séquence de nombres. Exemple: (2 1 8 9 3 11 10 20 12 21)(1 2 3 8 9 10 11 12 20 21) -> retour (8 9 10 11 12)
Je ne veux pas utiliser la fonction de tri et j'ai créé 2 fonctions (avec un peu d'aide) pour trier, mais maintenant je n'ai aucune idée de comment je pourrais trouver et renvoyer la plus longue séquence de nombres. Je pourrais parcourir la liste mais, comment puis-je stocker les numéros et vérifier si une liste de numéros consécutifs est plus longue qu'une autre?
Ce sont mes fonctions pour trier
(defun sortOne (list)
(let ((ca1 (car list)) (cd1 (cdr list)))
(if (null cd1)
list
(let ((cd (sortOne cd1))); cd = sorted tail
(let ((ca2 (car cd)) (cd2 (cdr cd)))
(if (<= ca1 ca2)
(cons ca1 cd)
(cons ca2 (cons ca1 cd2))))))))
(defun sortAll (list)
(if (null list)
nil
(let ((s (sortOne list)))
(cons (car s) (sortAll (cdr s))))))
J'espère que quelqu'un pourra m'aider.
Merci!
Solution du problème
Ce soir, j'ai réussi à le faire, mais ce n'est sûrement pas la meilleure solution, j'aimerais savoir comment utiliser une fonction lambda ou une récursivité pour mieux le faire.
(defun listilla (lista)
(setq lista (sort lista #'<))
(setq lista1 (list (car lista)))
(setq lista2 '())
(loop for i from 0 to (- (length lista) 2) do
(cond ((= (nth i lista) (- (nth (+ i 1) lista) 1))
(push (nth (+ i 1) lista) (cdr (last lista1))))
(t (push lista1 lista2)
(setq lista1 (list (nth (+ i 1) lista)))
)
)
)
(push lista1 lista2)
(setq masLargo (car lista2))
(loop for i from 1 to (- (length lista2) 2) do
(if (< (length (nth i lista2)) (length (nth (+ i 1) lista2)))
(setq masLargo (nth (+ i 1) lista2))
)
)
masLargo
)
(print (listilla '(23 15 6 5 78 4 77)))
Commentaires
Enregistrer un commentaire