Filter 如何在racket中定义我自己版本的过滤程序?
我是球拍新手,我被指派做我自己的过滤程序。其工作原理应类似于球拍过滤程序。目前,我的过滤器有两个参数:检查列表中项目的偶数过程和项目列表 到目前为止,我只能检查列表中的项目是否为偶数。我的过滤器应该遍历一个数字列表,检索偶数的数字并将它们保存在第二个列表中。如何遍历列表并将偶数存储在第二个列表中Filter 如何在racket中定义我自己版本的过滤程序?,filter,racket,Filter,Racket,我是球拍新手,我被指派做我自己的过滤程序。其工作原理应类似于球拍过滤程序。目前,我的过滤器有两个参数:检查列表中项目的偶数过程和项目列表 到目前为止,我只能检查列表中的项目是否为偶数。我的过滤器应该遍历一个数字列表,检索偶数的数字并将它们保存在第二个列表中。如何遍历列表并将偶数存储在第二个列表中 (define (my-filter f lst) (if (empty? lst) empty (cons (f (first lst))
(define (my-filter f lst)
(if (empty? lst)
empty
(cons
(f (first lst))
(my-filter f (rest lst)))))
您需要考虑以下三种情况:
- 输入列表为空->我们完成了
- 当前元素满足谓词函数->将其添加到输出并继续下一个元素
- 当前元素不满足谓词函数->跳过它并继续下一个元素
(f(first lst))
,这正是我们要计算的条件,我们应该添加(first lst)
。这就是我的意思:
(define (my-filter f lst)
(cond ((empty? lst) empty)
((f (first lst))
(cons (first lst) (my-filter f (rest lst))))
(else (my-filter f (rest lst)))))
它按预期工作:
(my-filter even? '(1 2 3 4 5 6))
=> '(2 4 6)
另一种观点是,只有两种情况:输入是空列表,输入不是空列表。对于后一种情况,您还有两个子类:第一个元素满足谓词,而第一个元素不满足谓词。同时,也感谢索拉维,这也是另一种看待问题的方式。
(my-filter even? '(1 2 3 4 5 6))
=> '(2 4 6)