2010-03-03 5 views
1

Je suis en train d'ajouter une matrice et il ne fonctionne pas ...plus Matrix dans le schéma

 
(define (matrix-matrix-add a b) 
    (map (lambda (row) (row-matrix-add row b)) 
     a)) 

(define (row-matrix-add row matrix) 
    (if (null? (car matrix)) 
     '() 
     (cons (add-m row (map car matrix)) 
      (row-matrix-add row (map cdr matrix))))) 

(define (add-m row col) 
    (if (null? col) 
     0 
     (+ (car row) 
     (car col) 
     (add-m (cdr row) (cdr col))))) 
+0

Qu'est-ce qui ne fonctionne pas? Avez-vous une erreur? – leppie

+0

Il ne fait pas ce qu'il supposait faire. Fondamentalement, l'addition est fausse. Juste commencé schéma –

Répondre

1

Voici une implémentation fonctionnelle:

(define (matrix-add m1 m2) 

    (define (matrix-add-row r1 r2 res-row) 
    (if (and (not (null? r1)) (not (null? r2))) 
    (matrix-add-row (cdr r1) (cdr r2) 
      (cons (+ (car r1) (car r2)) res-row)) 
    (reverse res-row))) 

    (define (matrix-add-each m1 m2 res) 
    (if (and (not (null? m1)) (not (null? m2))) 
    (let ((res-row (matrix-add-row (car m1) (car m2)()))) 
     (matrix-add-each (cdr m1) (cdr m2) (cons res-row res))) 
    (reverse res))) 
    (matrix-add-each m1 m2())) 

Exemple d'utilisation et de sortie:

> (matrix-add '((7 2) (3 8)) '((4 8) (0 5))) 
((11 10) (3 13)) 
> (matrix-add '((5 2) (4 9) (10 -3)) '((-11 0) (7 1) (-6 -8))) 
((-6 2) (11 10) (4 -11)) 
+0

Cette solution est horrible. Cela rend la chose beaucoup plus compliquée qu'elle ne l'est en réalité. –

3

Voici une implémentation de travail très courte. Map est bon pour se débarrasser d'une couche de récursivité, quand vous pouvez l'utiliser.

(define (matrice add x y) (carte (lambda (x y) (carte + x y)) x y))

+0

C'est exactement pour ce que je cherchais, merci! –