清除方案中的列表

时间:2016-04-10 12:45:00

标签: list scheme

(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)每个递归。但是,我无法成功。   我需要紧急帮助。

1 个答案:

答案 0 :(得分: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))))))

这就是它的工作原理:它创建了一个新的列表,其中删除了元素,使原始列表保持不变 - 这就是我们在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)))