方案

时间:2019-03-27 17:12:54

标签: scheme

(remove-all x lst)函数首先删除了 等于x。对于此问题,编写方案函数(remove-if f lst,该函数将返回包含(f x)为真的所有元素的列表。

我有简单的全部删除代码

(define (remove-all x ls)
  (if (null? ls)
      '()
      (if (eq? x (car ls))
          (remove-all x (cdr ls))
          (cons (car ls)
                (remove-all x (cdr ls))))))

但是我该如何修改它以便它接受一个函数并返回删除了返回true的那些元素的列表?

1 个答案:

答案 0 :(得分:1)

只需将比较谓词作为参数传递,并将硬编码的eq?替换为谓词:

(define (remove-if pred ls)
  (if (null? ls)
      '()
      (if (pred (car ls))
          (remove-if pred (cdr ls))
          (cons (car ls)
                (remove-if pred (cdr ls))))))

或更妙的是,在球拍中使用filter-not

(filter-not even? '(1 2 3 4 5 6))
=> '(1 3 5)