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)),但它应该返回 false,因为第一个有 4列表中的值和第二个只有两个,即使它们总体上具有相同的长度。我该怎么做。任何帮助,将不胜感激。

4

4 回答 4

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 回答
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)

最后,我们比较两个长度列表(实际上是:每行的列数),返回预期的结果:

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

请注意,最后的比较还将检测列表是否具有不同的大小,以防矩阵具有不同的行数。

于 2012-07-20T03:04:49.840 回答
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 回答
0

您需要澄清是否要检查 1)矩阵的确切形状或 2)整体“扁平”长度。

结果应该是什么(same-size-matrix? '((1 2) (3 4) (5 6)) '((1 2 3) (4 5 6)))

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

Óscar López 的答案是 1。

如果您的要求是 2,根据 Óscar 的回答:

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