3

コンピューター サイエンスのクラスの課題に取り組んでいるのですが、問題が発生しました。コミュニティが宿題プロジェクトに明確な回答を与えることに反対していることは知っていますが、それは私がここにいる目的ではありません。私は正しい軌道や思考プロセスに乗せられることを望んでいます。私が何を扱っているのか、どのようにブロックされているのかを理解していただくために、できるだけ多くの情報を提供するよう努めます。

最初に、これは LISP の言語への非常に簡単な「紹介」です。このコースでは、プログラミングのさまざまな側面とその開発の歴史についての洞察を得るために、いくつかの異なる種類の言語を紹介します。そのため、プロジェクトのルールは次のとおりです。

  • ループ機能は使用できません。代わりに、再帰を使用する必要があります
  • 次の固有関数setqconsappendlistequaldefuncarcdr、およびcondのみを使用できます
  • 関数の条件で追加のステップを作成するために使用できる「補助関数」を作成できます (ネストされた条件のようなもの)

私が問題を抱えている部分は、リストをパラメーターとして受け取り、そのリストをスキャンして重複を探し、重複を削除してリストを返す関数を作成することになっていることです。したがって、'(abcbadea) のリストを渡すと、(abcde) が返されます。

これまでのところ、要素をリストと比較し、要素がリストにある場合は T を返し、リストにない場合は nil を返すlist_memberという関数を作成するのが最善だと考えました。

(defun list_member (x L)
  (cond ((null L) nil)             ;if list L is empty, return NIL
    ((equal x (car L)) T)          ;if element x is in L, return T
    (T (list_member x (cdr L)))))  ;else, recursively check remainder of L

そして、関数 rem_dup で使用したいと思います。以下に入力を開始しました。

(defun rem_dup (L)
   (cond ((null L) nil)                     ;if list L is empty, return NIL to user
     (( list_member (car L) cdr L )) (...)  ;part I am having trouble with
     (T (rem_dup (cdr L)))))                ;else, check rest of list recursively

私の問題は、利用可能な機能を使用して、重複を削除してリストをまとめる方法を理解できないように見えることです。基本的に、list_member が true を返したときに何をすべきか、どこから始めればよいかわかりません。リスト形式を保持する唯一の関数は APPEND です。これは、単一の要素を扱っているためです (この場合、ネストされたリストも要素と見なされます)。私が使用できるすべてのリスト連結関数 (APPEND、CONS、LIST) は非破壊的です。

私は多くの解決策を考え出しましたが、返されたリストは私が望むものにさえ近くありません。ここにそれらをリストすると、おそらく混乱を招くと思います。私は自分自身に適切な質問をすることで壁にぶつかったので、私がまだ考えていない質問を思いつくことができるかどうかをみんなに見てもらうことにしました.

あなたの洞察に感謝します。

4

1 に答える 1

5

You have your cases backwards. If the first element is in the rest of the list, it's a duplicate, so you want to omit it. Otherwise, you want to return a list containing the first element consed onto the front of rem_dup of the rest.

(defun rem_dup (L)
   (cond ((null L) nil)                         ; if list L is empty, return NIL to user
         ((list_member (car L) (cdr L )) (rem_dup (cdr L))) ; Skip duplicate element
         (T (cons (car L) (rem_dup (cdr L)))))) ; else include it, and check rest of list recursively
于 2013-03-07T03:19:29.050 に答える