0

行列を回転させる方法は、行列の転置を取得してから、すべての行を逆にすることです。map (転置を返す) と reverse (90° 回転を完了する) の 2 つの関数を使用して、コンソールで次のことを行います。

(reverse (apply map list (list (list 1 2 3 4) (list 5 6 7 8) (list 9 10 11 12) (list 13 14 15 16)) ) )

 Result:  {{4 8 12 16} {3 7 11 15} {2 6 10 14} {1 5 9 13}}

それは正しいのですが、関数を作成したときに機能しません。

(define (transpose2 matriz)
      (reverse (apply map list matriz))

次に、次のことを行います。

> (transpose2 (list (list 1 2 3 4) (list 5 6 7 8) (list 9 10 11 12) (list 13 14 15) ) )

エラーがスローされるだけです:

mcar: 契約違反が予想されます: mpair? 与えられた: ()

(srfi :41) をインポートしようとしましたが (r6rs にも取り組んでいます)、どちらも機能しません。ただし、この関数は 3 x 3 マトリックスで機能します。

どうすればこれを修正できますか?

4

1 に答える 1

0

入力が正しくありませんでした。

(transpose2 (list (list 1 2 3 4) 
                  (list 5 6 7 8) 
                  (list 9 10 11 12) 
                  (list 13 14 15))) ;; here are only 3 elements while in the others 4!

(transpose2 (list (list 1 2 3 4) 
                  (list 5 6 7 8) 
                  (list 9 10 11 12) 
                  (list 13 14 15 16))) ;; this works flawlessly - you just forgot 16 before!

DrRacket は次のエラーを返します。

map: all lists must have same size; arguments were: #<procedure:list> '(1 2 3 4) '(5 6 7 8) '(9 10 11 12) '(13 14 15)

どんな種類の Scheme インタプリタを使用していましたか?

#lang racket

(define m (list (list 1 2 3 4)
                (list 5 6 7 8)
                (list 9 10 11 12)
                (list 13 14 15 16)))

(define (transpose2 mat)
  (reverse (apply map list mat)))

(reverse (apply map list m))
(transpose2 m)

;; both give:
;; '((4 8 12 16) (3 7 11 15) (2 6 10 14) (1 5 9 13))
于 2018-11-02T06:34:42.750 に答える