【问题标题】:racket: (my-filter p lst) function with lambda and foldr球拍:(my-filter p lst)函数与 lambda 和 foldr
【发布时间】:2016-06-10 09:13:17
【问题描述】:

我正在尝试使用 lambda、map 和 foldr 来实现一个函数(my-filter p lst)。

到目前为止我所拥有的是:

(define (my-filter1 p lst)
  (cond [(empty? lst) empty]
        [(p (first lst))
         (cons (first lst) (my-filter1 p (rest lst)))]
        [else (my-filter1 p (rest lst))]))

它工作正常,但我如何使用 lambda、map 和 foldr 将代码更改为一个?

提前致谢!

【问题讨论】:

    标签: list lambda racket


    【解决方案1】:

    首先我们需要看看foldr 是如何工作的。

      (foldr k e '(1 2 3))
    = (k 1 (k 2 (k 3 e)))
    

    k 视为cons 并将e 视为empty 会有所帮助。 例如:

      (foldr cons empty '(1 2 3))
    = (cons 1 (cons 2 (cons 3 empty)))
    = (list 1 2 3)
    

    要制作过滤器,我们需要使用仅 如果元素满足,则前置元素。

    (define (kons x xs)
      (if (p x)           ; where p is the predicate
          (cons x xs)
          xs))
    

    鉴于这个自定义的“cons”函数,我们可以将过滤器编写为

     (foldr kons empty '(1 2 3))
    

    一个完整的例子:

    #lang racket
    
    (define p odd?)
    
    (define (kons x xs)
      (if (p x)
          (cons x xs)
          xs))
    
    (foldr kons empty '(1 2 3 4 5 6))
    

    结果是:

     '(1 3 5)
    

    要将其转换为过滤器功能,请使用此模板:

    (define (my-filter p xs)
       (define (kons x xs) ...)
       (foldr ...))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多