-1

だから私は昨日 Lisp を学び始め、いくつかの問題をやり始めました。

私が苦労しているのは、リストを同じままにしてリストにアトムを挿入/削除(delete 'b '(g a (b) l))することです(g a () l)

また、私が問題を抱えているのは、この問題です。リストのどこかにアトムが存在するかどうかを確認することを想定しています。

私はそれをたどり、ある時点で戻ると言っていますTが、その後 a によってオーバーライドされますnil

皆さん助けてもらえますか:)?

私は使用しています(appear-anywhere 'a '((b c) g ((a))))

4回目の関数呼び出しで戻りますTが、その後になりnilます。

(defun appear-anywhere (a l)
  (cond
   ((null l) nil)
   ((atom (car l))
    (cond
     ((equal (car l) a) T)
     (T (appear-anywhere a (cdr l)))))
   (T (appear-anywhere a (car l))(appear-anywhere a (cdr l)))))
4

1 に答える 1

3

明らかな問題を 1 つ見てみましょう。

(defun appear-anywhere (a l)
  (cond
   ((null l) nil)
   ((atom (car l))
    (cond
     ((equal (car l) a) T)
     (T (appear-anywhere a (cdr l)))))
   (T (appear-anywhere a (car l))(appear-anywhere a (cdr l)))))

上記の最後の行について考えてみてください。

少し違うフォーマットにしましょう。

(defun appear-anywhere (a l)
  (cond
   ((null l) nil)
   ((atom (car l))
    (cond
     ((equal (car l) a) T)
     (T (appear-anywhere a (cdr l)))))
   (T
    (appear-anywhere a (car l))
    (appear-anywhere a (cdr l)))))

最後の 3 行: デフォルトとして (そのためTが存在します)、最後の 2 つの形式が計算されます。最初に最初のもの、次に 2 番目のもの。最初の形式の値は、使用されたり返されたりすることはありません。

それはおそらくあなたが望むものではありません。

現在、あなたのコードは、 の値がaリストの残りのどこかに現れたときに何かを返すだけです。最初の形式は実際には使用されません。

ヒント: 適切な論理コネクタは何ですか?

于 2012-09-20T16:29:16.340 に答える