2017-02-27 11 views
-1

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))) 
関連する問題