列表长度比较

时间:2012-07-20 02:37:57

标签: scheme

我想编写用于比较两个列表大小的代码。我利用了长度并将其写下来了。

(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 个答案:

答案 0 :(得分: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 :(得分: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

请注意,如果矩阵的行数不同,最后一次比较也将检测列表是否具有不同的大小。

答案 2 :(得分: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))))

答案 3 :(得分: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,则根据Óscar的回答:

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