Racketでの行列操作

Nov 24 2020

再帰を使用せずに、Racketで行列のn番目の列を生成する関数を作成する必要があります。たとえば(list (list 1 2 3) (list 2 3 4) (list 6 7 9))、2番目の列が必要な場合は、を受け取り(list 2 3 7)ます。

試し(append (map (lambda (n) (list-ref (list-ref M) n) n)) M))ましたが、エラーが表示され続けます。

回答

adabsurdum Nov 24 2020 at 09:32

試行されたソリューションはlist-ref2回使用しますが、これは不要であり、それらの呼び出しの1つに十分な引数がありません。(list-ref M)関数は1つの引数のみを取りますが、リストと整数の2つの引数が必要です。

このlist-ref関数は、入力リストからインデックス付き要素(list-ref '(1 2 3) 1)を返すため、を返し2ます。ここで何をmapするかを考えてみましょう。マトリックスはリストのリスト(行のリスト)として、つまり((1 2 3) (2 3 4) (6 7 9))。として表されます。map関数は、リストされている入力リストのメンバー、に作用し(1 2 3)(2 3 4)(6 7 9)mappingをlist-refその入力オーバー機能を、あなたがサブリストから希望の方要素取ることができます。したがって、必要に応じ(map (lambda (row) (list-ref row 1)) '((1 2 3) (2 3 4) (6 7 9)))(2 3 7)、に評価されます。

行列から任意の列を取得できる関数は次のとおりです。

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

相互作用の例:

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)