私は楽しみのためにこのチュートリアルを進めていたのですが、彼が最後に言った「演習: 和と差の線形再帰的な実装を与えてください」という言葉に行き詰まってしまいました。(リスト用)
ユニオン、心配はいりません。
違い、汗。
試みはこのように見えます。. .
(defun list-diff (L1 L2)
(cond
((null L1) L2)
((null (member (first L1) L2)) (cons (first L1) (list-diff (rest L1) L2)))
(t (list-diff (rest L1) L2))
)
)
これで、L1 にあり、L2 にないすべての要素が返されますが、L2 のすべてが返されるだけです (明らかに)。同様に、3 行目の L2 を「nil」に変更すると、L2 にない L1 はすべて返されますが、L2 は返されません。
私の回避策の試みは再帰的ではないように見えます。再帰的であるときは、スタックオーバーフローが発生します ((list-diff L2 L1) をどこかで呼び出しようとした場合など)。
リスト交差などの彼の他の演習では、L1 の要素を実行するだけで済みます。ここで、L2 から重要な要素を取得するか、(list-diff L2 L1) を実行して、両方の結果を結合したいと考えていますが、これはもはや線形再帰的ではありません。
考え?
(実際には宿題ではありません。LISP を楽しみに見てみようと思っただけです。)
編集:応答に基づいて、これを適切に行う関数は次のとおりです。
(defun list-diff (L1 L2)
(cond
((null L1) nil)
((null (member (first L1) L2)) (cons (first L1) (list-diff (rest L1) L2)))
(t (list-diff (rest L1) L2))
)
)