这个球拍代码有什么问题?
问题描述:
我写了这个代码(完整的球拍),如果一组是另一组的一部分,你能告诉我什么是错的吗?这个球拍代码有什么问题?
(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]))
答
您正在更改作为参数传递的内容的类型。在调用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)))
是它抛出一个错误?如果是这样,在哪里?如果没有错误,请描述您的问题。 –