Manipulación de matrices en raqueta
Necesito escribir una función que produzca la enésima columna de una matriz en Racket sin usar la recursividad. Por ejemplo, (list (list 1 2 3) (list 2 3 4) (list 6 7 9))si quisiera la segunda columna, la recibiría (list 2 3 7).
Lo intenté (append (map (lambda (n) (list-ref (list-ref M) n) n)) M)), pero sigue mostrándome un error.
Respuestas
La solución intentada usa list-refdos veces, lo cual no es necesario, y una de esas llamadas no tiene suficientes argumentos: (list-ref M)la función solo toma un argumento, pero requiere dos argumentos: una lista y un número entero.
La list-reffunción devolverá un elemento indexado de una lista de entrada, por (list-ref '(1 2 3) 1)lo que volverá 2. Considere lo mapque hará aquí: la matriz se representa como una lista de listas (una lista de filas), es decir, como ((1 2 3) (2 3 4) (6 7 9)). La mapfunción será actuar sobre los miembros de la lista de entrada, que son las listas (1 2 3), (2 3 4)y (6 7 9). Al hacer mapping a la list-reffunción sobre esa entrada, puede tomar el elemento que desee de las sublistas. Entonces, (map (lambda (row) (list-ref row 1)) '((1 2 3) (2 3 4) (6 7 9)))evaluaría a (2 3 7), como se desee.
Aquí hay una función que le permite tomar cualquier columna de una matriz:
(define (nth-column M n)
(map (lambda (row) (list-ref row n)) M))
Interacciones de muestra:
scratch.rkt> (define M '((1 2 3)
(2 3 4)
(6 7 9)))
scratch.rkt> (nth-column M 1)
'(2 3 7)
scratch.rkt> (nth-column M 0)
'(1 2 6)
scratch.rkt> (nth-column M 2)
'(3 4 9)