3

要素 '(abc) '(dbf) の 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))

4

4 に答える 4

10

他の人が言っているように、あなたがする必要があるのは、2つのセットの共通部分、和集合、および減算を計算するための別々の関数を作成し、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)))))

注:これらはセットであり、順序は重要ではないため、結果は並べ替えられません。また、関数は入力がセットであると想定しているため、結合に必要なものを超えて重複チェックを実行しません。

于 2009-04-19T15:19:33.837 に答える
3

確かにそれは可能です。差、和集合などを計算する関数があると仮定します。

 (define (checkResult lis1 list2)
   (list (difference lis1 lis2)
        (union ...
于 2009-04-19T14:32:47.943 に答える
2

確かにそれは可能です。ここにいくつかのヒントがあります:

  1. リストと空のリストを組み合わせた結果は?
  2. すべてを一度に行う必要はありません。一度に一片を取ります。
于 2009-04-19T14:32:16.323 に答える
1

チャーリー・マーティンとトムジェンの答えに加えて、私はこの情報源を思いつきました:

合体交点と差

明確な機能の実装は、素晴らしい説明で見つけることができます。

于 2009-04-19T14:41:03.367 に答える