这就是我所拥有的,但只有当 elt 出现在列表的开头时它才有效
(define (delete-all xx elt)
(cond ((null? xx) null)
((equal? elt (car xx)) (delete (cdr xx) elt))))
您错过了一个额外的案例:如果当前元素不是您要删除的元素,会发生什么?这是需要做什么的总体思路,我不会给你一个直接的答案,因为这看起来像家庭作业(你应该homework
在你的问题中使用标签)。最好自己填空:
(define (delete-all xx elt)
(cond ((null? xx) ; base case: empty list
null) ; return the empty list
((equal? elt (car xx)) ; current element needs to be removed
<???>) ; ignore current element and make recursive call
(else ; current element needs to be added to the list
(<???> (car xx) <???>)))) ; add current element and make recursive call
此外,不要调用delete
您的答案,因为这是一个递归解决方案,您需要改为调用delete-all
,但使用适当的参数来保持递归直到达到基本情况。提示:cons
andcdr
呢?
您也可以使用filter
,也就是说,如果您被允许使用高阶函数:
(define (delete-all xx elt)
(filter (lambda (y) (not(eq? xx y))) elt))
(define (delete-all xx elt)
remove* xx elt)