2 つのリストを受け取り、4 つのリストを返すスキーム関数の書き方

StackOverflow https://stackoverflow.com/questions/765484

  •  12-09-2019
  •  | 
  •  

質問

要素 '(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 ...

確かにそれは可能です。いくつかのヒントを次に示します。

  1. リストと空のリストを組み合わせた結果は何ですか?
  2. すべてを一度に行う必要はありません。一度に一片ずつ取ります。

チャーリー・マーティンとtomjenの答えの上に、私はこのソースが出ているます:

<のhref = "http://joung.im.ntu.edu.tw/teaching/pl/2005/solutions/hw2/B91705034-2.scm" のrel = "nofollowをnoreferrer" タイトル= "UNION交点DIFFERENCE ">連合交差点との違いの

の異なる機能の実装は素敵な説明を見つけることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top