Scheme函数 - 获取一个原子和一个列表,并返回新列表,其中从给定列表中删除给定的原子出现

时间:2018-05-21 06:30:37

标签: list scheme

(define (remover lst n)
    (cond ((null? lst) ())
        ((eq? (car lst) n) (cdr lst))
        (else (cons (car lst) (remover (cdr lst) n)))))

(remover 'f '(a f c g f b))

此代码生成以下错误。

  

car:期待类型的论点;鉴于f

1 个答案:

答案 0 :(得分:1)

您似乎使用交换参数调用remover。如果你这样称呼它:

(remover '(a f c g f b) 'f)

您将获得结果(a c g f b)

由于您要删除f的所有匹配项,因此您还必须将(cdr lst)更改为(remover (cdr lst) n),如下所示:

(define (remover lst n)
    (cond ((null? lst) ())
        ((eq? (car lst) n) (remover (cdr lst) n))
        (else (cons (car lst) (remover (cdr lst) n)))))

然后(remover '(a f c g f b) 'f)也应该产生预期结果(a c g b)

要让remover的参数切换,你必须在定义和两个递归调用中切换它们,如下所示:

(define (remover n lst)
    (cond ((null? lst) ())
        ((eq? (car lst) n) (remover n (cdr lst)))
        (else (cons (car lst) (remover n (cdr lst))))))