Matrices

Solo disponible en BuenasTareas
  • Páginas : 7 (1662 palabras )
  • Descarga(s) : 0
  • Publicado : 14 de febrero de 2012
Leer documento completo
Vista previa del texto
Ejemplo: Producto de matrices
*****************************

Las matrices m se representan como una lista de las filas en donde
cada fila es un lista con los elementos. En otras palabras
m corresponde a: ( (m11 m12 ...) (m21 m22 ...) ...)
en donde mij representa el elemento de m en la fila i ycol. j. Por

El objetivo implementar (prod m1 m2) como el producto de m1 y m2,
suponiendo que ambas matrices están bien formadas.

Ej.: (prod '((1 2) (3 4) (5 6)) '((3 5) (4 6))) => ((11 17) (25 39) (39 61))

previo:
- calcular la matriz traspuesta(define (traspuesta m)
(cond
((null? (car m)) '())
(else (cons (map car m) (traspuesta (map cdr m)))) ))

- calcular el producto punto entre dos vectores (a1 a2 ...) (b1 b2 ...)
con el mismo número de elementos:

Sol. 1(define (prod-punto v w) (apply + (map (lambda (x y) (* x y)) v w)))

Sol. 2
(define (prod-punto v w)
(cond
((null? v) 0)
(else (+ (* (car v) (car w)) (prod-punto (cdr v) (cdr w)))) ))

- calcular el producto de un vector poruna matriz:

Sol. 1
(define (prod-vect v m) (map (lambda (w) (prod-punto v w)) m))

Sol. 2
(define (prod-vect v m)
(cond
((null? m) '())
(else (cons (prod-punto v (car m)) (prod-vect v (cdr m)))) ))- calcular el producto de matrices:

Sol. 1
(define (prod a b) (prod-trasp a (traspuesta b)))

(define (prod-trasp a b)
(map (lambda (v) (prod-vect v b)) a) )

Sol. 2
(define (prod a b) (prod-trasp a (traspuesta b)))(define (prod-trasp a b)
(cond
((null? a) '())
(else (cons (prod-vect (car a) b) (prod-trasp (cdr a) b))) ))


Recursión por la cola
*********************

Motivación: procedimiento para calcularel largo de la pila.

(define (len l)
(cond
((null? l) 0)
(else (+ 1 (len (cdr l)))) ))

Una típica preocupación usual de los programadores en Scheme es que este
procedimiento puede alcanzar niveles de profundidad excesivos para la pila,haciendo que se desborde. Si esto es un problema, se puede modificar
la implementación para lograr recursión por la cola:

(define (len2 l) (tail-len l 0))
(define (tail-len l s)
(cond
((null? l) s)
(else (tail-len (cdr l) (+ s 1))) ))Se dice que (tail-len ...) es una llamada por la cola, i.e.
el valor retornado por el llamador es directamente el valor retornado
por el llamado (sin nunguna operación entre medio).
En cambio la llamada de len en len no es por la cola porque
es necesario procesar el valor sumándole 1, antes de retornarlo....
tracking img