Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

on s'est déjà pris la tête avec des tris sur des listes. C'est un sujet similaire, car je souhaite obtenir le minimum d'une liste avec une fonction qu'on va appeler min-list.

 

Quand on a :

(setq L '(5 3 2 8 10 5 0 -3 8 -3))

 

on obtient :

 

(min-list L)

-3

 

Là, c'est facile, puisqu'il suffit de faire un tri et de prendre le premier de la liste.

 

Là ou je voudrais corser la chose c'est en demandant la même chose sur une liste de listes, comme sur cet exemple :

 

(setq L '(1 (2 4 6 0) (3 -1 (2 -5)) 4 5 6))

 

où (min-list L) doit donner -5

 

Amicalement

Vincent

 

 

 

 

[Edité le 27/8/2008 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Super, un challenge !!!

 

EDIT : hier soir, dans l'enthousiasme provoqué chez moi par un nouveau challenge intéressant, j'avais posté une réponse.

 

Je déplace momentanément cette réponse (quelque part sur le site...) len attendant qu'il y ait d'autres réponses.

 

[Edité le 28/8/2008 par (gile)]

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

Posté(e)

Bonjour,

 

un petit indice : c'est un challenge où on peut (où on doit...) s'intéresser à la récursivité.

 

Autre indice : dans la condition d'arrêt j'ai utilisé la fonction (atom article). Mais on peut aussi avoir une préférence pour (listp article).

 

J'avais omis de préciser qu'il s'agissait d'une liste de nombres, ce qui permet l'utilisation de la fonction (min nombre nombre ...)

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Ca y est, la fonction est faite. :D

 

Bonjour,

un petit indice : c'est un challenge où on peut (où on doit...) s'intéresser à la récursivité.

c'est le cas

 

Autre indice : dans la condition d'arrêt j'ai utilisé la fonction (atom article). Mais on peut aussi avoir une préférence pour (listp article).

pas utilisé

 

J'avais omis de préciser qu'il s'agissait d'une liste de nombres, ce qui permet l'utilisation de la fonction (min nombre nombre ...)

liste d'entiers ou entiers et ou réels?

 

oui, c'est vrai qu'il y a la fonction min, mais pas dans ma première version. je vais essayer de faire

un code avec elle.

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Bonjour,

 

chaque nombre peut être un réel ou un entier. La fonction min renvoie un réel si un des arguments est un réel, sinon elle renvoie un entier.

Associé à apply, min donne quelque chose de pas mal

(apply 'min '(5 3 2 0 -1.5))

-1.5

 

On pourrait aussi utiliser la fonction de tri vl-sort

 

(car (vl-sort '(5 3 2 0 -1.5) '<))

-1.5

 

l'avantage c'est que la liste pourrait être alphanumérique (ce qu'on sait gérer avec vl-sort mais pas avec min)

(car (vl-sort '("c" "d" "a") '<))

"a"

 

Maintenant, il ne reste "que" la récursivité

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

http://autolisp-exchange.com/forum/showpost.php?p=271&postcount=6

(defun test (lst fun)
 (if
   (cdr lst)
   (test (cons (fun (car lst) (cadr lst)) (cddr lst)) fun)
   (car lst)
   ) ;_  if
 ) ;_  defun

(test '(5 3 2 8 10 5 0 -3 8 -3) min) ;=> -3
(test '(5 3 2 8 10 5 0 -3 8 -3) max) ;=> 10
(test '(5 3 2 8 10 5 0 -3 8 -3) +) ;=> 35
(test '(5 3 2 8 10 5 0 -3 8 -3) -) ;=> -25
(test '(5 3 2 8 10 5 0 -3 8 -3) *) ;=> 0
(test '(5 3 2 8 10 5 0 -3 8 -3) /) ;=>  error: divide by zero

 

[Edité le 28/8/2008 par ElpanovEvgeniy]

Evgeniy

Posté(e)

Bonjour

 

D'habitude, je vois plus facilement les itératives par rapport aux récursives, mais là je sèche sans faire une usine à gaz...

 

Comme le bal commence :)

(defun min-lst(lst)
 (apply 'min (mapcar '(lambda(x) (if (listp x) (min-lst x) x)) lst))
)

 

Et en reprennant l'idée d'ElpanovEvgeniy

(defun min-max(lst fun)
 (apply fun (mapcar '(lambda(x) (if (listp x) (min-max x fun) x)) lst))
)

(min-max '(1 (2 4 6 0) (3 -1 (2 -5)) 4 5 6) 'min) --> 5

(min-max '(1 (2 4 6 0) (3 -1 (2 -5)) 4 5 6) 'max) --> 6

 

ElpanovEvgeniy

Your lisp don't work

(test '(1 (2 4 6 0) (3 -1 (2 -5)) 4 5 6) min) --> ; erreur: type d'argument incorrect: numberp: (2 4 6 0)

 

@+

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

Posté(e)

Voici mon premier jet, donc sans le min:

 

;--------------------------------------;
; nom: min_list_bseb67_v1              ;
; role: cherche et renvoie le minimum  ;
;       d'une liste d'entiers ou de    ;
;       réels                          ;
; param: liste => liste d'entiers ou de;
;                 de réels             ;
; retour: un entier et le minimum      ;
; date: 28/08/2008                     ;
; BLAES Sébastien                      ;
;--------------------------------------;
(defun min_list_bseb67_v1( liste / res e tmp)
 	; le resultat c'est le premier élément
(setq res (nth 0 liste))

 	; si jamais ce n'est pas un entier, c'est que c'est une liste
 	; donc on prend le premier élément dans cette sous liste
 	(while (or (/= (type res) 'INT) (/= (type res) 'REAL))
  	(setq res (nth 0 res))
); while

 	; on va rechercher le minimum dans liste
 	(mapcar (function (lambda (e) (if (= (type e) 'LIST) ; si c'est une sous-liste on recherche le minimum dedans
					  (if (< (setq tmp (min_list_bseb67_v1 e)) res)
					    (setq res tmp)
					  )
					  (if (< e res)
					    (setq res e)
					  )))) liste)

res	   
) ; min_list_bseb67_v1

 

n'utilisant pas le min, il me faut chercher le premier nombre.

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Ma réponse (donnée précipitamment hier soir, puis cachée ici) est la même que celle donnée par Patrick_35

 

	(defun min-list (lst)
(apply 'min
(mapcar
(function
(lambda (x)
(if (listp x)
(min-list x)
x
)
)
)
lst
)
)

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

Posté(e)

Vous êtes trop forts...

 

(defun min-list (ll)
 (if (atom ll)
   ll
   (if (null (cdr ll)) 
     (min-list (car ll))
     (min (min-list (car LL)) (min-list (cdr LL)))
   )
 )
) 

 

Voilà ce que j'avais en magasin. C'est moins bien qu'avec le mapcar, il suffit de faire un trace de la fonction pour s'en apercevoir.

 

Sinon, en m'inspirant (très fortement) de ce que vous avez faits, on pourrait aussi écrire

 

(defun min-listv (lst)
 (car (vl-sort
   (mapcar
     (function
       (lambda (x)
         (if (listp x)
           (min-listv x)
           x
         )
       )
     )
     lst
   )
   '<)
 )
)

 

histoire que ça marche pour tout type de liste.

 

Amicalement

Vincent

 

 

[Edité le 28/8/2008 par zebulon_]

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)
ElpanovEvgeniy

Your lisp don't work

(test '(1 (2 4 6 0) (3 -1 (2 -5)) 4 5 6) min) --> ; erreur: type d'argument incorrect: numberp: (2 4 6 0)

 

@+

Oui, j'ai montré seulement la partie de la tâche. :)

Evgeniy

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é