2 つのリストを受け取り、4 つのリストを返すスキーム関数の書き方
質問
要素 '(a b c) '(db f) のリストが 2 つあり、1 つの結果で相違点、和集合、共通部分を見つけたいと考えています。それは可能ですか?どうやって?
最初のリストの車が 2 番目のリストにあるかどうかを確認するメンバー関数を作成しましたが、新しいリストにメンバーをスローすることができません。
(define (checkResult lis1 lis2)
(cond...........
))
(checkresult '( a b c) '(d b f))
私の結果はこうなるはずです (( a c) (d f) (a b c d f) (b))
.
解決
他の人と同じようにすべてを行う必要が交差点、労働組合、および二組の減算を計算するために別々の機能を作成し、checkresultからそれらを呼び出すある、と述べています
(define (checkresult a b)
(list (subtract a b)
(subtract b a)
(union a b)
(intersect a b)))
ここでは、いくつかの例示的な組合、交差点、及び減算関数である
(define (element? x lst)
(cond ((null? lst) #f)
((eq? x (car lst)) #t)
(#t (element? x (cdr lst)))))
(define (union a b)
(cond ((null? b) a)
((element? (car b) a)
(union a (cdr b)))
(#t (union (cons (car b) a) (cdr b)))))
(define (intersect a b)
(if (null? a) '()
(let ((included (element? (car a) b)))
(if (null? (cdr a))
(if included a '())
(if included
(cons (car a) (intersect (cdr a) b))
(intersect (cdr a) b))))))
(define (subtract a b)
(cond ((null? a) '())
((element? (car a) b)
(subtract (cdr a) b))
(#t (cons (car a) (subtract (cdr a) b)))))
注:これらはセットと関係ないためであるため、結果がソートされていません。また、関数は、入力がセットされているので、組合のために必要なのものを超えてチェックし、重複をしないことを前提としています。
他のヒント
それが可能であることを確認してください。あなたは違いを計算する機能、組合交差点などを持っていると仮定します:
(define (checkResult lis1 list2)
(list (difference lis1 lis2)
(union ...
確かにそれは可能です。いくつかのヒントを次に示します。
- リストと空のリストを組み合わせた結果は何ですか?
- すべてを一度に行う必要はありません。一度に一片ずつ取ります。
チャーリー・マーティンとtomjenの答えの上に、私はこのソースが出ているます:
<のhref = "http://joung.im.ntu.edu.tw/teaching/pl/2005/solutions/hw2/B91705034-2.scm" のrel = "nofollowをnoreferrer" タイトル= "UNION交点DIFFERENCE ">連合交差点との違いの
の異なる機能の実装は素敵な説明を見つけることができます。
所属していません StackOverflow