我正在尝试在 racket 中编写一个函数(全部删除 xx elt),该函数返回一个新列表,其中删除了所有出现的 elt



这就是我所拥有的,但只有当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,但要使用适当的参数来保持递归,直到达到基本情况提示conscdr呢?

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

(define (delete-all xx elt)
  (filter (lambda (y) (not(eq? xx y))) elt))
(define (delete-all xx elt)
  remove* xx elt)

最新更新