我想编写用于比较两个列表大小的代码。我利用了长度并将其写下来了。
(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列表中的值和第二个只有两个,即使它们都具有相同的长度。我该如何解决这个问题。任何帮助,将不胜感激。
答案 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))))