2010-03-15 7 views
4

Si j'avais un N liste de longueur M, comment pourrais-je écrire une belle fonction propre pour retourner une seule liste de longueur M, où chaque élément est la somme des éléments correspondants dans les N listes?Addition vectorielle de listes

(à partir d'apprendre Lisp - aller facile!)

Répondre

9

Ceci est un emploi pour les fonctions map et apply. Voici une façon de le faire, avec un EDIT suggéré par Nathan Sanders:

(define (add-lists . more) 
    (apply map + more)) 
+1

Appliquer prend plusieurs arguments, seul le dernier est une liste, pour que vous puissiez vous en sortir avec '(appliquer la carte + plus)' –

+1

Désolé - je faisais des erreurs embarrassantes. Merci pour votre excellente réponse! – ntimes

+0

@Nathan: Cool. Je ne savais pas que cela s'appliquait au «apply» de Scheme; Je fais la plupart de mes lectures en CL. – Pillsy

2

Pour une plus Matlab syntaxe:

(define (piecewise func) 
    (lambda more 
    (apply map func more))) 
(define pw piecewise) 

((pw +) '(1 2 3 4 5) '(6 7 8 9 0)) 
((pw -) '(1 2 3 4 5) '(6 7 8 9 0)) 
((pw *) '(1 2 3 4 5) '(6 7 8 9 0)) 
((pw /) '(1 2 3 4 5) '(6 7 8 9 0.1)) 

sorties:

(7 9 11 13 5) 
(-5 -5 -5 -5 5) 
(6 14 24 36 0) 
(1/6 2/7 3/8 4/9 50.0) 
2

Juste ce fonctionne dans le système MIT.

(map + '(1 2 3) '(4 5 6) '(7 8 9)) 
;Value 28: (12 15 18) 
Questions connexes