2017-02-27 51 views
-1

我寫了這個代碼(完整的球拍),如果一組是另一組的一部分,你能告訴我什麼是錯的嗎?這個球拍代碼有什麼問題?

(struct myset (lst)) 

(define (member? a lst) 
(cond 
[(empty? lst) false] 
[(equal? a (first lst)) true] 
[else (member? a (rest lst))])) 

;; (subset? a b) determines if a is a subset of b 
;; subset?: Set Set -> Bool 
(define (subset? a b) 
(cond 
[(empty? (myset-lst a)) true] 
[(empty? (myset-lst b)) false] 
[(member? (first (myset-lst a)) (myset-lst b)) 
    (subset? (rest (myset-lst a)) (myset-lst b))] 
[else false])) 
+2

是它拋出一個錯誤?如果是這樣,在哪裏?如果沒有錯誤,請描述您的問題。 –

回答

0

您正在更改作爲參數傳遞的內容的類型。在調用subset?時,你傳遞一個帶有列表成員的結構體。遞歸時,您通過列表(rest (myset-lst a))和列表(myset-lst b)。在遞歸中,它會嘗試執行(myset-lst a)來獲取列表,但它會失敗,因爲a不是myset結構,而是列表。

您應該將這些集合保留爲列表(不使用結構),或者您需要將遞歸封裝起來,因此(myset (rest (myset-lst a)))可以創建一個沒有第一個元素的新集合。爲什麼你在遞歸中改變b是一個謎。

如果你需要結構你可以只使用一個幫手:

(define (subset? subset set) 
    (define set-lst (myset-lst set)) 
    (define (helper subset-lst) 
    ...) 
    (helper (myset-lst subset)))