这个球拍代码有什么问题?

这个球拍代码有什么问题?

问题描述:

我写了这个代码(完整的球拍),如果一组是另一组的一部分,你能告诉我什么是错的吗?这个球拍代码有什么问题?

(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

是它抛出一个错误?如果是这样,在哪里?如果没有错误,请描述您的问题。 –

您正在更改作为参数传递的内容的类型。在调用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)))