Liste n-uplet en Scheme
Résolu
Freaks
-
Freaks -
Freaks -
A voir également:
- Liste n-uplet en Scheme
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Liste code ascii - Guide
- Site dangereux liste - Guide
- Liste site streaming illégal - Accueil - Services en ligne
6 réponses
Up.
(define (N-max L)
(if (pair? (car L))
(if (< (car (cdr (car L))) (car (cdr (car (cdr L)))))
(N-max (cons (cadr L) (cdr (cdr L))))
(N-max (cdr L)))
)
)
J'ai fais ce programme mais j'ai un message d'erreur au niveau du gras.
Ca dit: "car: expects argument of type <pair>; given ()"
Je ne comprend pas trop pourquoi ça affiche ça...
(define (N-max L)
(if (pair? (car L))
(if (< (car (cdr (car L))) (car (cdr (car (cdr L)))))
(N-max (cons (cadr L) (cdr (cdr L))))
(N-max (cdr L)))
)
)
J'ai fais ce programme mais j'ai un message d'erreur au niveau du gras.
Ca dit: "car: expects argument of type <pair>; given ()"
Je ne comprend pas trop pourquoi ça affiche ça...
L=(("bob" 2 10) ("leo" 12 13) ... ("jo" 14 11)) (car L) = ("bob" 2 10) (cdr (car L)) = (2 10) (car (cdr (car L))) = 2 (cdr L)=(("leo" 12 13) ... ("jo" 14 11)) (car (cdr L)) = ("leo" 12 13) (cdr (car (cdr L))) = (12 13) (car (cdr (car (cdr L)))) = 12
Pas de problème, tu as bien ce que tu veux, sauf qu'après tu appelles (N-max (cdr L)) donc L diminue au fur et à mesure :
L=(("jo" 14 11)) (car L) = ("jo" 14 11) (cdr (car L)) = (14 11) (car (cdr (car L))) = 14 (cdr L)=() (car (cdr L)) = "car: expects argument of type <pair>; given ()"
Il faut que tu utilises un test (if (null (cdr L))) pour prendre en compte ce dernier cas.
Remarque :
Tu peux utiliser (trace N-max) pour consulter les appels successifs de N-max
Pour annuler le traçage : (untrace N-max)
Vu que j'arrivais pas à faire, j'ai essayer d'utiliser un autre define dans le define:
(define (N-max L)
(define (N-max2 L)
(if (pair? L)
(max (car (cdr (car L))) (N-max2 (cdr L)))
0))
(if (= (car (cdr (car L))) (N-max2 L))
(car L)
(N-max (cdr L))))
Avec ça, ça marche j'ai essayer plusieurs méthode et ça marchait.
Sinon, si je souhaite par exemple obtenir le dernier n-uplet de la liste dont le 2e élément est le plus grand au lieu du premier n-uplet, que dois-je faire ?
Merci, pour ta réponse, je vais essayer de trouver aussi avec ce que tu m'as dit.
(define (N-max L)
(define (N-max2 L)
(if (pair? L)
(max (car (cdr (car L))) (N-max2 (cdr L)))
0))
(if (= (car (cdr (car L))) (N-max2 L))
(car L)
(N-max (cdr L))))
Avec ça, ça marche j'ai essayer plusieurs méthode et ça marchait.
Sinon, si je souhaite par exemple obtenir le dernier n-uplet de la liste dont le 2e élément est le plus grand au lieu du premier n-uplet, que dois-je faire ?
Merci, pour ta réponse, je vais essayer de trouver aussi avec ce que tu m'as dit.
Voici comment je ferais (en Common Lisp, je te laisse le convertir en Scheme)
(defun nmax (l) ( (if (null (cdr l)) (car l) (nmax (cons (if (> (cadar l) (cadadr l)) (car l) (cadr l) ) (cddr l) ) ) ) ) (nmax '(("a" 1 1) ("b" 2 1) ("c" 2 2))) ; --> ("c" 2 2)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ahh je te remercie, j'ai réussi à le traduire en scheme. Je savais pas, par contre, qu'on pouvait introduire un if dans le cons
Sinon, à partir de ton programme, quel serait le résultat si tu voulais prendre le 1er n-uplet dont le 2e élément est le plus grand ? (Il devrait y avoir pas beaucoup de différence... )
Je te remercie pour ton temps passé à m'aider.
Cordialement, Freaks.
Sinon, à partir de ton programme, quel serait le résultat si tu voulais prendre le 1er n-uplet dont le 2e élément est le plus grand ? (Il devrait y avoir pas beaucoup de différence... )
Je te remercie pour ton temps passé à m'aider.
Cordialement, Freaks.
Effectivement il y aurait peu de différence, il suffirait de remplacer > par >=
Pour le if dans le cons, c'est "évident", if retourne toujours une valeur, soit celle du "then", soit celle du "else" donc ça ne pose pas de problème.
J'aurais pu faire (nmax (if (...) (cons ...) (cons ...))), if aurait donc pris la valeur d'un des deux cons, mais ça aurait nécessité de répéter les cons alors que le deuxième paramètre est le même.
J'ai donc préféré faire (nmax (cons (if ...) ...)) pour éviter cette répétition...
Pour le if dans le cons, c'est "évident", if retourne toujours une valeur, soit celle du "then", soit celle du "else" donc ça ne pose pas de problème.
J'aurais pu faire (nmax (if (...) (cons ...) (cons ...))), if aurait donc pris la valeur d'un des deux cons, mais ça aurait nécessité de répéter les cons alors que le deuxième paramètre est le même.
J'ai donc préféré faire (nmax (cons (if ...) ...)) pour éviter cette répétition...
Avec mon programme:
Ca marche pas de la même manière que le tien. Vu que j'ai fais avec un = que je met > ou >= ça donne pas le même résultat..
(define (N-max L) (define (N-max2 L) (if (pair? L) (max (car (cdr (car L))) (N-max2 (cdr L))) 0)) (if (= (car (cdr (car L))) (N-max2 L)) (car L) (N-max (cdr L))))
Ca marche pas de la même manière que le tien. Vu que j'ai fais avec un = que je met > ou >= ça donne pas le même résultat..
Ton code souffre d'un gros problème de complexité, à chaque fois que tu appelles N-max, tu recalcules N-max2, du coup pour une liste de taille N, tu fais O(N²) calculs, quand je n'en fais que O(N). En plus c'est assez compliqué à relire...
Néanmoins, si tu veux continuer sur le code que tu as fait, il faut que tu enlève l'imbrication N-max et N-max2, à peu près comme ceci (je n'ai pas vérifié) :
La confiance n'exclut pas le contrôle
Néanmoins, si tu veux continuer sur le code que tu as fait, il faut que tu enlève l'imbrication N-max et N-max2, à peu près comme ceci (je n'ai pas vérifié) :
(define (N-max2 L) (if (pair? L) (max (car (cdr (car L))) (N-max2 (cdr L))) 0 ) ) (define (N-max3 L M L2) (if (pair? L) (if (= (car (cdr (car L))) M) (N-max3 (cdr L) M (car L)) ; ou (car L) (N-max3 (cdr L) M L2) ) L2 ) ) (define (N-max L) (N-max3 L (N-max2 L) ()) )
La confiance n'exclut pas le contrôle