(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的那些元素的列表?
答案 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)