2012-07-20 101 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))))