Aller au contenu

Challenge récursive.


Messages recommandés

Bonjour

 

Pour faire suite à ce sujet, rien ne vaut un bon exercice.

L'idée est de déterminer si j'ai un double dans une liste, et de manière récursive.

(gile), comme tu es notre maitre à tous, tu as un handicap d'une journée ;)

 

Exemples :

(doublon '(1 2 3 4 5 6 7 8 9)) --> nil

(doublon '(1 2 3 4 5 6 7 8 9 1)) --> T

(doublon '(1 2 3 4 5 1 6 7 8 9)) --> T

 

(doublon '((1 2) (2 3) (4 5) (6 7) (8 9))) --> nil

(doublon '((1 2) (2 3) (4 5) (6 7) (8 9) (1 2))) --> T

 

(doublon '((1 2 3) (2 3) (4 5) (6 7) (8 9) (1 2))) --> nil

(doublon '((1 2 3) (2 3) (4 5) (6 7) (8 9) (1 2 3))) --> T

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Salut Patrick,

dans ton exemple, je ne vois pas où tu as besoin de la récursivité ?

donc je propose ça, hors sujet car non récursif, mais qui donne le même résultat que toi:

(defun doublon (lst / true 1er mb)
 (while (and lst (not true))
   (setq 1er (car lst))

   (setq true (and (setq mb (member 1er lst))
	    (member 1er (cdr mb))))
   	 (setq lst (cdr lst))
 )
   true
)

Pour avoir besoin de la récursivité je pense qu'on serai dans:

(ContientDoublon '((1 2 3) (2 3 3) (4 5) (6 7) (8 9) (1 2 3)))-> T

dis moi si quelque chose m'échappe ?

a+

gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

dans ton exemple, je ne vois pas où tu as besoin de la récursivité ?

Tu peux toujours utiliser l'itératif. C'était plus pour éviter l'utilisation des variables et c'est aussi pour travailler sur le récursif. Essaye une itérative sans variable.

 

Il n'y a qu'un seul cas à ma connaissance qui nécessite le récursif, c'est l'arborescence.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Il n'y a qu'un seul cas à ma connaissance qui nécessite le récursif, c'est l'arborescence.

 

1+ avec Patrick_35 seul le traitement des structures de données récursives (typiquement les arborescences) nécessite un traitement récursif.

Mais parfois la récursivité permet de résoudre simplement des problèmes complexes (fonction factorielle ou suite de Fibonacci pour les exemples les plus courant).

Et il est des individus qui "pensent récursif" ou pour qui l'approche récursive récursive est plus immédiate que l'approche itérative. À ce propos, je pense que tu peux aussi mettre un handicap d'une journée à VDH-bruno.

 

Pour plus coller au sujet qui a motivé ce challenge je vais en proposer un autre facile.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Je pense que ce challenge est suffisamment facile pour que ceux-là se retiennent.

facile ?

j'utilise souvent la récursivité pour parcourir des arborescences de fichier xml, parcourir des listes de liste,

et là ça m'inspire.

la je vois pas l’intérêt donc pour moi c'est carrément impossible, je jette l'éponge ...

je regarderai la solution demain !

a+

gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Essaye une itérative sans variable.

 

Bonjour,

Je triche un peu, mais avec une fonction anonyme? pas de variable!

(defun doublon (lst / )
(apply 'or (mapcar '(lambda (x) (if (member x (cdr (member x lst))) T)) lst))
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

...vous allez nous filer mal à la tête...

C'est déjà fait... ;)

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

facile ?

j'utilise souvent la récursivité pour parcourir des arborescences de fichier xml, parcourir des listes de liste,

et là ça m'inspire.

la je vois pas l’intérêt donc pour moi c'est carrément impossible, je jette l'éponge ...

je regarderai la solution demain !

a+

gégé

 

Et pourtant, une liste LISP est une liste chaînée, structure qui est une forme d'arbre binaire (voir ici).

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Je triche un peu, mais avec une fonction anonyme? pas de variable!

(defun doublon (lst / )
(apply 'or (mapcar '(lambda (x) (if (member x (cdr (member x lst))) T)) lst))
)

Bravo Bonus. je ne l'avais pas vu comme ça, mais chapeau :D

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Bravo Bonus. je ne l'avais pas vu comme ça, mais chapeau :D

Patrick,

je comprends de moins en moins:

pour moi ton challenge, c'est bien d'avoir une routine doublons qui s'appelle en récursivité ?

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Patrick,

je comprends de moins en moins:

pour moi ton challenge, c'est bien d'avoir une routine doublons qui s'appelle en récursivité ?

Oui, mais cela ne m'empêche pas d'apprécier une autre manière de faire.

Le challenge reste une récursive.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Patrick, il est tard et je te maudis !

ne me fais plus jamais ça, pas pu me sortir cette histoire de la tête !

c'est peut être pas la bonne version ,mais ça marche

 

Commande: (doublon '(1 2 3 4 5 6 7 8 9))

nil

Commande: (doublon '(1 2 3 4 5 6 7 8 9 1))

T

Commande: (doublon '(1 2 3 4 5 1 6 7 8 9))

T

Commande: (doublon '((1 2) (2 3) (4 5) (6 7) (8 9)))

nil

Commande: (doublon '((1 2) (2 3) (4 5) (6 7) (8 9) (1 2)))

T

Commande: (doublon '((1 2 3) (2 3) (4 5) (6 7) (8 9) (1 2)))

nil

Commande: (doublon '((1 2 3) (2 3) (4 5) (6 7) (8 9) (1 2 3)))

T

(defun doublon (lst)
(cond
 ((and lst
  (listp lst)	
  (member (car lst) (cdr lst)))
 t)
 ((and lst
  (listp lst)	
  )
 (doublon (cdr lst))
)
)
)

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Bravo à tous les deux, vous avez répondu à la demande, après, c'est juste une question d'élégance du code.

 

@GEGEMATIC, on doit pouvoir supprimer certaines redondances

 

@x_all, tu peux éviter tous les (setq ...), par exemple :

(progn
 (setq lstR (cdr lstR))
 (doublon lstR)
)

peut s'écrire beaucoup plus simplement.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Décidément, je bute, j'ai finis par regarder, je n’étais pas loin.

et celle que je préfère pour sa concision est celle de Bonuscad.

sinon hors challenge je pense que j'aurais fait cela.

(defun doublon (lst)
(if (/= (length lst) (length (remove-doubles lst))) T) 
)

(defun remove-doubles (lst);de Gile
 (if lst (cons (car lst) (remove-doubles (vl-remove (car lst) lst))))
)

 

hihihi

Lien vers le commentaire
Partager sur d’autres sites

@x_all, plutôt qu'utiliser une variable inutile, ce qui t'oblige à utiliser (progn ...)

(progn
 (setq lstR (cdr lstR))
 (doublon lstR)
)

tu peux écrire simplement :

(doublon (cdr lstR))

 

@Fraid, celle là je l'adore (d'habitude c'est plutôt en VB qu'on voit ça), tant qu'à faire dans le verbeux, vas-y carrément :

(if (/= (length lst) (length (remove-doubles lst))) 
 T
 nil
)

qui est exactement équivalent à :

(/= (length lst) (length (remove-doubles lst)))

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Hors challenge, dans l'esprit de ce qu'a donné bonuscad :

 

(defun doublon (l)
 (or (vl-some '(lambda (x) (member x (cdr (member x l)))) l))
)

 

L'utilisation de (or ...) sert juste à renvoyer T au lieu de la première occurrence de (member x (cdr (member x l))). C'est uniquement pour respecter une règle du challenge, et ça serait inutile dans un autre cadre : pour les conditionnelles LISP tout ce qui n'est pas nil est considéré comme vrai.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité