【问题标题】:How to define my own version of filter procedure in racket?如何在球拍中定义我自己的过滤程序版本?
【发布时间】:2021-02-06 08:19:17
【问题描述】:

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

到目前为止,我只能检查列表中的项目是否是偶数。 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)

【问题讨论】:

    标签: filter racket


    【解决方案1】:

    您需要考虑三种情况:

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

    您将最后两种情况混合为一个情况。请注意,您不能在输出中添加(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)
    

    【讨论】:

    • 另一种观点看这个是只有两种情况:输入是空列表,输入不是空列表。对于后一种情况,您还有两个子情况:第一个元素满足谓词,第一个元素不满足谓词。
    • 非常感谢 Óscar,现在更有意义了。而且,还要感谢 Sorawee,这也是另一种看待方式。
    猜你喜欢
    • 2013-10-17
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2019-09-30
    • 2021-04-01
    • 2018-10-09
    相关资源
    最近更新 更多