質問

私はR5RSスキームおよびIを使用していますちょうど2つの与えられたリストの交差点を返す関数を実装したいが、私は、リストに要素を追加することはできませんので、私はそれを行うことはできません。ここに私のコードです。どのように私はそれを修正することができますか?私は本当にスキームで初心者だ - これは、スキームを使用して私の最初の仕事です。

事前にTHX ..

(define list3 '())
(define (E7 list1 list2)

        (cond
          ((null? list1)
          list3)
          ((member (car list1) list2) (append list3 (list (car list1))))

        )
  (cond
          ((null? list1)
          list3)
          ((not(null? list1)) (E7 (cdr list1) list2)

        )

     )


)
(E7 '(4 5) '(3 4))
役に立ちましたか?

解決

ここでは、交差点の代わりに労働組合を行い、再帰的バージョンである。

(define (intersect list1 list2)
  (cond ((null? list1)   list1)
        ((member (car list1) list2)   (cons (car list1) (intersect (cdr list1) list2)))
        (t   (intersect (cdr list1) list2))))

他のヒント

私はあなたの問題を参照してくださいと思います。リストに要素を追加する方法は2つあります。

最初の方法は、実際にそれを追加することになります。

(define (intersect list1 list2)
  (define newlist list2)
  (do ((iter1 list1 (cdr iter1)))
    (not (null? iter1))
    (if (not (member (car iter1) newlist))
        (set! newlist (cons (car iter1) newlist)))))

(あなたが本当にこれを使用したい場合は、おそらくdoの定義をルックアップする必要があります。)

あなたはそれが非常に醜いだことがあります。誰が実際にそれをこのようにしませんからです。代わりに、関数を呼び出すことだけでなく、新しい変数を作成していることを認識する必要があります。これを試してください:

(define (intersect list1 list2)
  (cond ((null? list1) list2)
        ((member (car list1) list2) (intersect (cdr list1) list2))
        (else (intersect (cdr list1) (cons (car list1) list2)))))
あなたはアルゴリズムに精通している場合、

は、私はちょうど書いたコードは非常に遅いことがわかりますが、それはポイントを示しています。それぞれの場合に、あなたが仕事の少しを行うと、再度あなたの関数を呼び出します。あなたは、トラブル、なぜこの作品を見を持っている場合は、あなたの例で代わりにこの関数を実行します:

(define (intersect list1 list2)
  (display list1) (display " ") (display list2) (newline)
  (cond ((null? list1) list2)
        ((member (car list1) list2) (intersect (cdr list1) list2))
        (else (intersect (cdr list1) (cons (car list1) list2)))))

ここではいくつかの単純なelispのは、次のとおりです。

(defun is (l1 l2)
  (let ((rtn))
    (mapc
      (lambda (e) 
        (if (member e l1)
          (push e rtn)))
      l2)
    rtn))

これは、内蔵のこれらの簡単なテストのための交差点と同じ動作をします

(is '(1 2 5) '(1 4 10 5))  => (5 1)
(intersection '(1 2 5) '(1 4 10 5)) => (5 1)

(is '(1 4 10 5) '(1 2 5)) => (5 1)
(intersection '(1 4 10 5) '(1 2 5)) => (5 1)

あなたはより良い集合演算を使用してオフにしているからをSRFI-1。

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