2012-07-20 75 views
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值在列表中,第二个只有两个,即使它们都具有相同的长度。我该如何解决这个问题。任何帮助,将不胜感激。

回答

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相同的操作:

​​

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

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

注意,最后补偿如果列表的大小不同,万一这些矩阵有不同的行数。

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 
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)))) 
+0

你假设矩阵中的所有行具有相同的长度,可能不总是这样的情况 - 例如,实施时锯齿状阵列。 – 2012-07-20 13:31:36

+0

@Oscar是的。这就是为什么我添加矩阵?现在更清楚地看到相同大小的检查和“矩阵性”检查的不同之处。 – soegaard 2012-07-20 13:40:49

0

你需要澄清,如果要检查1)矩阵的精确形状或2)整体“扁平”的长度。

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

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

ÓscarLópez的回答为1。

如果你的要求是2,根据奥斯卡的答案:

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