我正在尝试在球拍中编写一个函数(delete-all xx elt),它返回一个新列表,其中删除了所有出现的elt

时间:2012-09-09 15:45:47

标签: list lisp scheme racket

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

时它才有效
(define (delete-all xx elt)
  (cond ((null? xx) null)
        ((equal? elt (car xx)) (delete (cdr xx) elt))))

3 个答案:

答案 0 :(得分: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,但需要使用适当的参数来保持递归直到基本情况到达了。 提示conscdr怎么样?

答案 1 :(得分:1)

您也可以使用filter,即允许您使用higher order functions

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

答案 2 :(得分:-2)

(define (delete-all xx elt)
  remove* xx elt)