Matrixmanipulation im Schläger

Nov 24 2020

Ich muss eine Funktion schreiben, die die n-te Spalte einer Matrix in Racket ohne Rekursion erzeugt. Zum Beispiel, (list (list 1 2 3) (list 2 3 4) (list 6 7 9))wenn ich die 2. Spalte wollte, würde ich erhalten (list 2 3 7).

Ich habe es versucht (append (map (lambda (n) (list-ref (list-ref M) n) n)) M)), aber es zeigt mir immer wieder einen Fehler.

Antworten

adabsurdum Nov 24 2020 at 09:32

Die versuchte Lösung verwendet list-refzweimal, was nicht erforderlich ist, und einer dieser Aufrufe verfügt nicht über genügend Argumente: (list-ref M)Die Funktion akzeptiert nur ein Argument, erfordert jedoch zwei Argumente - eine Liste und eine Ganzzahl.

Die list-refFunktion gibt ein indiziertes Element aus einer Eingabeliste zurück und (list-ref '(1 2 3) 1)kehrt daher zurück 2. Überlegen Sie, was maphier zu tun ist: Die Matrix wird als Liste von Listen (eine Liste von Zeilen) dargestellt, dh als ((1 2 3) (2 3 4) (6 7 9)). Die mapFunktion wirkt auf die Mitglieder der Eingabeliste, die die Listen (1 2 3)sind (2 3 4), und (6 7 9). Indem Sie mapdie list-refFunktion über diese Eingabe pingen, können Sie das gewünschte Element aus den Unterlisten übernehmen. So (map (lambda (row) (list-ref row 1)) '((1 2 3) (2 3 4) (6 7 9)))würde bewerten zu (2 3 7), wie gewünscht.

Hier ist eine Funktion, mit der Sie eine beliebige Spalte aus einer Matrix entnehmen können:

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

Beispielinteraktionen:

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)