LISP -

2012-04-30 12 views
0

ネストされたリストで、リストから要素を削除した私は、内部のインナーリストが含まれているリストから要素を削除する必要があります。あらかじめ定義された要素はすべての内部リストからも削除する必要があります。LISP -

私は、次のコードを使用して作業を開始しました:

(SETQ L2 '(a b (a 2 b) c 1 2 (D b (a s 4 2) c 1 2 a) a)) ; defined my list 

; Created a function for element removing 
(defun elimina (x l &optional l0) 
(cond ((null l)(reverse l0)) 
((eq x (car l))(elimina x (cdr l) l0)) 
(T (elimina x (cdr l) (cons (car l) l0)))) 
) 

(ELIMINA 'a L2) 

しかし残念ながら、それは、ネストされたリスト外の要素のみを削除します。

私は内側のリストから要素を削除する追加機能を作成しようとしました。

(defun elimina-all (x l) 
(cond ((LISTP (CAR L))(reverse l)(elimina x (car l))) 
(T (elimina-all x (CDR L))) 
) 
) 

でも、まだ失敗しています。

あなたは私はそれを動作するように助けてくださいことはできますか?

ありがとうございます。

+1

この宿題ですか?はいの場合は、宿題を追加してください。 –

+4

コードを正しくインデントする必要があります。今のように読むのは難しいです。 –

答えて

0

は多分このように:すべての

(defun elimina (x l &optional l0) 
    (cond ((null l) (reverse l0)) 
     ((eq x (car l)) (elimina x (cdr l) l0)) 
     (T (elimina x (cdr l) (cons (if (not (atom (car l))) 
             (elimina x (car l)) 
             (car l)) 
            l0))))) 
+0

これは良い解決策ですが、ありがとうございますが、例えばリストから要素のセットを削除することはできません: (ELIMINA(a2 b)L2) – e20

+0

その場合は、 eq x(car l)) 'と'(if(atom x)(eq x(car l))(メンバー(car l)x)) 'とを比較します。 –

+0

'(member(car l)x)'を使うと、リストの最初のメンバーだけがリスト全体から削除されます。しかし実際には、(A(A 2 B))リスト(L2)から '(A 2 B)'を削除することがポイントです。 – e20

2

まず、私は、少なくとも、あなたはこの本を読んでthis pageをお勧めしたい、それは説明する(とも非常に良い例を紹介します!)ツリーをトラバースする方法の最も重要なのは、より複雑なタスクをより単純なタスクから活用するために、機能をどのように組み合わせるかです。

;; Note that this function is very similar to the built-in 
;; `remove-if' function. Normally, you won't write this yourself 
(defun remove-if-tree (tree predicate) 
    (cond 
    ((null tree) nil) 
    ((funcall predicate (car tree)) 
    (remove-if-tree (cdr tree) predicate)) 
    ((listp (car tree)) 
    (cons (remove-if-tree (car tree) predicate) 
      (remove-if-tree (cdr tree) predicate))) 
    (t (cons (car tree) 
      (remove-if-tree (cdr tree) predicate))))) 

;; Note that the case of the symbol names doesn't matter 
;; with the default settings of the reader table. I.e. `D' and `d' 
;; are the same symbol, both uppercase. 
;; Either use \ (backslash) or || (pipes 
;; around the symbol name to preserve the case. Eg. \d is the 
;; lowercase `d'. Similarly, |d| is a lowercase `d'. 
(format t "result: ~s~&" 
     (remove-if-tree 
     '(a b (a 2 b) c 1 2 (D b (a s 4 2) c 1 2 a) a) 
     #'(lambda (x) (or (equal 1 x) (equal x 'a))))) 

ここでは、問題に近づく方法の簡単な例を示します。コメントを読む。

0

私はあなたと同じ答えを探していたと、残念ながら、私は完全に私はそれに働いたので、上記の答えを理解していない可能性があり、最終的に私は正確に何をしたいんそのLispで本当に単純な関数を得ました。

(defun remove (a l) 
(cond 
    ((null l)()) 
     ((listp (car l))(cons (remove a (car l))(remove a (cdr l)))) 
     ((eq (car l) a) (remove a (cdr l))) 
     (t (cons (car l) (remove a (cdr l)))) 
     ) 
    ) 

この関数は、 'list is null'と 'first element is list'の2つの単純なケースで始まります。これに続いて、あなたは「魔法」与えられた要素なしのリストとリストのcdrcarを取得します。リスト全体の答えになるように修正するには、consを使用してそれらをまとめてください。