Question

Je veux utiliser le prédéfini (max) fonction (r5rs) avec un list de nombres, qui varient en longueur. Malheureusement, (max) accepte les entrées comme ceci:

(max 2 43 5 6)
=> 43

J'essaie de l'utiliser comme ça:

(define lst '(3 5 53 4 53 54 32))
(max lst)

Cela produit l'erreur suivante.

max: expects argument of type <real number>; given (3 5 53 4 53 54 32)

Comment puis-je briser cette liste dans les arguments individuels dont j'ai besoin, car je les passe (max)?

Était-ce utile?

La solution

Vous pourriez envisager d'utiliser apply (Bien qu'il soit averti, que cela peut imposer des limites en ce qui concerne le nombre d'éléments / arguments est acceptable, selon votre mise en œuvre du schéma):

(apply max '(3 4 2 1 78 2 1))

En général, si le nombre d'éléments n'est pas connu pour être petit, il pourrait être plus sûr de le faire manuellement:

(define max* (list)
    (if (null? list) (negative-infinity)
        (let loop ((list (cdr list)) (best (car list)))
            (if (null? list) best (loop (cdr list) (max best (car list)))))))

Autres conseils

Utilisation d'appliquer se traduit essentiellement par la course (max 3 4 2 1 78 2 1) Mais le nombre d'arguments qu'une procédure peut être adopté n'est pas infini sur certains systèmes. Pour max, vous pouvez profiter de sa commutativité en utilisant le pli:

(fold-left max -inf.0 '(3 4 2 1 78 2 1))

Vous pouvez écrire une procédure qui compare le premier élément au second,

(define (largestele lst)
        (if (null? (cdr lst))
            (car lst)
            (if (> (car lst) (cadr lst))
                (largestele (cons (car lst) (cddr lst)))
                (largestele (cdr lst)))))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top