试试这个:
(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
请注意,最后的比较还将检测列表是否具有不同的大小,以防矩阵具有不同的行数。