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