如何在球拍中定义我自己的过滤程序版本?

How to define my own version of filter procedure in racket?

我是 Racket 的新手,我被分配做 我自己的过滤器 程序。它的工作方式应该类似于 Racket 过滤器程序。目前,my-filter 有两个参数:检查列表中项目的 even 过程和项目列表。

到目前为止,我只能检查列表中的项目是否均匀。 my-filter 应该遍历数字列表,检索偶数并将它们保存在第二个列表中。如何遍历列表并将偶数存储在第二个列表中?

(define (my-filter f lst)
  (if (empty? lst) 
     empty 
     (cons 
        (f (first lst)) 
        (my-filter f (rest lst)))))
> (my-filter even? '(1 2 3 4 5 6))
'(#f #t #f #t #f #t)

您需要考虑三种情况:

  • 输入列表为空 -> 我们完成了。
  • 当前元素满足谓词函数 -> 将其添加到输出并继续下一个元素。
  • 当前元素不满足谓词函数 -> 跳过它并继续下一个元素。

您将最后两个案例混合为一个案例。请注意,您不能将 (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)