Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/scheme/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 列表长度比较_Scheme - Fatal编程技术网

Scheme 列表长度比较

Scheme 列表长度比较,scheme,Scheme,我想编写代码来比较两个列表的大小。我利用长度写下了这个 (define (same-size-matrix? mtrx1 mtrx2) (equal? (length mtrx1) (length mtrx2))). 我原以为这对我有用,但我发现它只检查总长度,而不是子列表。例如,它在比较时返回true((1 2 3 4)(4 5 6)(6 7 8 9))和'((5 4)(3 2)(7 1)),但它应该返回false,因为第一个值在列表中有4个值,第二个值只有两个,尽管它们总体上具有相

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

(define (same-size-matrix? mtrx1 mtrx2)
   (equal? (length mtrx1) (length mtrx2))). 
我原以为这对我有用,但我发现它只检查总长度,而不是子列表。例如,它在比较时返回true((1 2 3 4)(4 5 6)(6 7 8 9))和'((5 4)(3 2)(7 1)),但它应该返回false,因为第一个值在列表中有4个值,第二个值只有两个,尽管它们总体上具有相同的长度。我该怎么做呢。任何帮助都将不胜感激

是计划吗

(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
请尝试以下方法:

(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)
首先,
相同大小矩阵?
计算该表达式,该表达式在
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

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

这里是
相同大小的简单定义

#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))))

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

对于
(相同大小的矩阵?'((12)(34)(56))((123)(456)))
,结果应该是什么

奥斯卡·洛佩斯的答案是1

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

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

您假设矩阵中的所有行都具有相同的长度,但情况可能并非总是如此——例如,在实现交错数组时。@Oscar Yes。这就是我添加矩阵的原因?。现在可以更清楚地看到相同大小的检查和“矩阵性”检查的区别。
(define (same-size-matrix? mtrx1 mtrx2)
  (equal? (apply + (map length mtrx1)) (apply + (map length mtrx2))))