2

2 つのリストのサイズを比較するコードを書きたかったのです。長さを生かして書いてみました。

(define (same-size-matrix? mtrx1 mtrx2)
   (equal? (length mtrx1) (length mtrx2))). 

これでうまくいくと思いましたが、サブリストではなく全体の長さだけをチェックすることがわかりました。たとえば、比較すると true を返します。'((1 2 3 4) (4 5 6 6) (6 7 8 9)) および '(( 5 4) (3 2) (7 1)) ですが、最初は 4 であるため、false を返すはずです。リスト内の値と 2 番目の値は全体的に同じ長さですが、2 つしかありません。これについてどうすればいいですか。どんな助けでも大歓迎です。

4

4 に答える 4

1

の簡単な定義を次に示しsame-size?ます。

#lang racket

; A MATRIX is a list of ROWs.
; A ROW is a list of numbers.
; In a matrix all rows are of the same length.

(define (row-size list-of-rows)
  (length list-of-rows))

(define (column-size matrix)
  (define first-row (first matrix))
  (length first-row))

(define (same-size? matrix1 matrix2)
  (and (= (row-size matrix1) (row-size matrix2))
       (= (column-size matrix1) (column-size matrix2))))

おまけとして、オブジェクトが行列かどうかをテストする述語があります。それをデータ定義と比較します。

(define (row? object)
  (and (list? object)
       (andmap number? object)))

(define (matrix? object)
  (and (list? object)
       (andmap row? object)
       (apply = (map row-size object))))
于 2012-07-20T12:10:09.577 に答える
1

代わりにこれを試してください:

(define (same-size-matrix? mtrx1 mtrx2)
  (equal? (map length mtrx1) (map length mtrx2)))

このソリューションでは、各リストの全長 (マトリックス内の行数) を比較していますが、各サブリストの長さ (マトリックス内の各行の列数) は無視していることに注意してください。私の魂では、最初に各サブリストの長さを計算し、その後、すべての長さが等しいかどうかを確認します。たとえば、次の入力を使用します。

(define mtrx1 '((1 2 3 4) (4 5 6 6) (6 7 8 9)))
(define mtrx2 '((5 4) (3 2) (7 1)))
(same-size-matrix? mtrx1 mtrx2)

最初にsame-size-matrix?はこの式を評価し、 の各サブリストの長さを見つけmtrx1ます。ギザギザの配列を扱っている場合は、最初の長さだけでなく、すべての長さをチェックする必要があります。

(map length mtrx1)
; evaluates to '(4 4 4)

そして、次の式があります。これは、 に対して同じ操作を実行しmtrx2ます。

(map length mtrx2)
; evaluates to '(2 2 2)

最後に、長さの 2 つのリスト (実際には、行ごとの列数) を比較して、期待される結果を返します。

(equal? '(4 4 4) '(2 2 2))
> #f

行列の行数が異なる場合、最後の比較では、リストのサイズが異なるかどうかも検出されることに注意してください。

于 2012-07-20T03:04:49.840 に答える
1

スキームですか?

(define m1 `((1 2 3 4) (4 5 6 6 ) (6 7 8 9)))                                                                                                
(define m2 `((5 4) (3 2) (7 1)))                                                                                                            

(define (same-size-matrix? m1 m2) (equal? (map length m1) (map length m2)))                                                                  


(same-size-matrix? m1 m2) ; => #f
(same-size-matrix? m1 m1) ; => #t
于 2012-07-20T03:01:59.827 に答える
0

1) マトリックスの正確な形状または 2) 全体の「平坦化された」長さを確認するかどうかを明確にする必要があります。

の結果は(same-size-matrix? '((1 2) (3 4) (5 6)) '((1 2 3) (4 5 6)))何ですか?

1) => #f
2) => #t

オスカル・ロペスの答えは 1 です。

オスカーの答えに基づいて、要件が2の場合:

(define (same-size-matrix? mtrx1 mtrx2)
  (equal? (apply + (map length mtrx1)) (apply + (map length mtrx2))))
于 2012-07-20T21:44:30.383 に答える