2016-04-10 15 views
0
(define ls2 '((james (1 2 3) (4 5 6) (8 5 6)) 
       (daren (7 8 9) (2 6 4)) 
      ))  
(define (delete name lst clear) 
     (if (equal? (caar ls2) name) (clear (cdar lst)) 
     (delete name (cdr lst) clear))) 

(define (clear lst) 
     (if (null? lst) #t (remove (car lst) lst))) 

(delete 'james ls2 clear) 

ジェームズが明確である必要があり、リストの要素(1 2 3)(4 5 6)(8 5 6)と一致している場合。私はちょうど(1 2 3)をクリアして、それぞれを再帰的にクリアしたい(4 5 6)(8 5 6)。しかし、私はそれを成功させることはできません。 緊急の助けが必要です。あなたが書いた消去方式でリスト

答えて

0

clear手順はremoveは、removed要素が存在しない新しいリストを作成しますが、元はそのまま残り、機能しません。代わりにこれを試してみてください:

(define (delete name lst) 
    (cond ((null? lst) '()) 
     ((equal? (caar lst) name)  ; if there's a match 
     (cons (list (caar lst))   ; clear all elements at once 
       (delete name (cdr lst)))) ; and advance recursion 
     (else (cons (car lst) 
        (delete name (cdr lst)))))) 

これは、それがどのように働くかである:それはそのまま元のリストを残して、要素が削除され、新しいリストを作成する - それが私たちはSchemeでプログラムを書く方法は次のとおりです。

(define lst '((james (1 2 3) (4 5 6) (8 5 6)) 
       (daren (7 8 9) (2 6 4)))) 

(delete 'james lst) 
=> '((james) (daren (7 8 9) (2 6 4))) 
+0

ありがとうございましたすべてのためにたくさん。あなたの助けが私を救済させる:) –