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)