Manipulacja matrycą w rakiecie

Nov 24 2020

Muszę napisać funkcję, która tworzy n-tą kolumnę macierzy w Racket bez użycia rekursji. Na przykład, (list (list 1 2 3) (list 2 3 4) (list 6 7 9))gdybym chciał otrzymać drugą kolumnę, to otrzymałbym (list 2 3 7).

Próbowałem (append (map (lambda (n) (list-ref (list-ref M) n) n)) M)), ale ciągle pokazuje mi błąd.

Odpowiedzi

adabsurdum Nov 24 2020 at 09:32

Próbowane rozwiązanie wykorzystuje list-refdwa razy, co nie jest potrzebne, a jedno z tych wywołań nie ma wystarczającej liczby argumentów: (list-ref M)ma funkcję przyjmującą tylko jeden argument, ale wymaga dwóch argumentów - listy i liczby całkowitej.

list-refFunkcja zwróci indeksowany element z listy wejściowej, tak (list-ref '(1 2 3) 1)powróci 2. Zastanów się, co mapzrobisz tutaj: macierz jest reprezentowana jako lista list (lista wierszy), tj ((1 2 3) (2 3 4) (6 7 9)). Jako . mapFunkcja będzie działać na członków listy wejściowego, które są listy (1 2 3), (2 3 4)i (6 7 9). Przez mapOdpytaj list-reffunkcja nad tym wejściu, można wziąć dowolny pierwiastek chcesz z podlisty. Tak więc, zgodnie z życzeniem , (map (lambda (row) (list-ref row 1)) '((1 2 3) (2 3 4) (6 7 9)))oszacuje (2 3 7).

Oto funkcja, która pozwala pobrać dowolną kolumnę z macierzy:

(define (nth-column M n)
  (map (lambda (row) (list-ref row n)) M))

Przykładowe interakcje:

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)