2016-04-10 21 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) 

Wenn James ist mit einem Element der Liste abgestimmt dann (1 2 3) (4 5 6) (8 5 6) muss klar sein. Ich kann nur die (1 2 3) löschen und ich möchte (4 5 6) (8 5 6) jeweils durch rekursiv löschen. Aber das kann ich nicht schaffen. Ich brauche bitte eine Notfallhilfe.Löschen der Liste in Schema

Antwort

0

Das clear Verfahren Sie wird nicht funktionieren geschrieben, erstellt remove eine neue Liste, wo das entfernte Element nicht vorhanden ist, aber das Original bleibt erhalten. Versuchen Sie stattdessen:

(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)))))) 

Dies ist, wie es funktioniert: Sie schafft eine neue Liste, wo die Elemente entfernt werden, unmodifizierten die ursprüngliche Liste zu verlassen - das ist, wie wir Programme in Schema schreiben:

(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

Danke viel für alles. Deine Hilfe macht mich erleichtert :) –