4

这就是我所拥有的,但只有当 elt 出现在列表的开头时它才有效

(define (delete-all xx elt)
  (cond ((null? xx) null)
        ((equal? elt (car xx)) (delete (cdr xx) elt))))
4

3 回答 3

4

您错过了一个额外的案例:如果当前元素不是您要删除的元素,会发生什么?这是需要做什么的总体思路,我不会给你一个直接的答案,因为这看起来像家庭作业(你应该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,但使用适当的参数来保持递归直到达到基本情况。提示consandcdr呢?

于 2012-09-09T16:16:33.637 回答
1

您也可以使用filter,也就是说,如果您被允许使用高阶函数

(define (delete-all xx elt)
  (filter (lambda (y) (not(eq? xx y))) elt))
于 2020-03-28T02:31:29.450 回答
-2
(define (delete-all xx elt)
  remove* xx elt)
于 2012-09-12T03:32:35.903 回答