라켓의 행렬 조작

Nov 24 2020

재귀를 사용하지 않고 Racket에서 행렬의 n 번째 열을 생성하는 함수를 작성해야합니다. 예를 들어 (list (list 1 2 3) (list 2 3 4) (list 6 7 9))두 번째 열을 원하면 (list 2 3 7).

을 시도 (append (map (lambda (n) (list-ref (list-ref M) n) n)) M))했지만 계속 오류가 표시됩니다.

답변

adabsurdum Nov 24 2020 at 09:32

시도 된 솔루션은 list-ref필요하지 않은 두 번 을 사용하며 이러한 호출 중 하나에는 충분한 인수가 없습니다 (list-ref M). 함수가 하나의 인수 만 취하지 만 두 개의 인수 (목록과 정수)가 필요합니다.

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). 해당 입력에 map대해 list-ref함수 를 ping 하면 하위 목록에서 원하는 요소를 가져올 수 있습니다. 따라서 원하는대로로 (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)