2016-04-10 45 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創建一個新的列表,其中刪除元素不存在,但原來保持不變。試試這個:

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

這是如何工作的:它會創建一個新的列表,其中的元素被移除,留下原始列表未修改的 - 這就是我們如何編寫程序的方案:

(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

謝謝很多東西。你的幫助讓我解脫:) –