【问题标题】:How to use foldr in Racket to eliminate numbers in a list that are greater than any subsequent numbers如何在 Racket 中使用 foldr 消除列表中大于任何后续数字的数字
【发布时间】:2016-09-10 20:27:26
【问题描述】:

我必须使用 foldr 在 Racket 中编写一个函数,该函数将获取一个数字列表并删除大于任何后续数字的列表元素。

示例:(eliminate-larger (list 1 2 3 5 4)) 应该产生 (1 2 3 4)

我可以在不使用 foldr 或任何高阶函数的情况下做到这一点,但我无法使用 foldr 来解决。这是我所拥有的:

(define (eliminate-larger lst)
   (filter (lambda (z) (not(equal? z null))) 
       (foldr (lambda (x y) 
           (cons (determine-larger x (rest lst)) y)) null lst))                    
)

(define (determine-larger value lst)
   (if (equal? (filter (lambda (x) (>= x value)) lst) lst)
       value
       null)
)

determine-larger 将接受一个值和一个列表,如果它大于或等于列表中的所有元素,则返回该值。如果不是,则返回 null。现在,消除更大的函数正在尝试遍历列表并将每个值传递给确定更大,以及它后面的每个数字的列表。如果它是一个“好”值,它将被返回并放入列表中,如果它不是 null 则放入列表中。然后最后将过滤掉空值。我的问题是获取 foldr 函数中当前数字之后的数字列表。使用“rest lst”不起作用,因为它没有像那样递归地完成。如何获得foldr中x之后的其余数字?

【问题讨论】:

    标签: racket fold higher-order-functions


    【解决方案1】:

    我真的希望我不是在为你做作业,但是这里……

    如何获得foldr中x之后的其余数字?

    因为您正在使用列表从右侧,您可以构建累加器,以便“x 之后的其余数字”可用作其memo 参数。

    (define (eliminate-larger lst)
      (foldr 
        (lambda (member memo)
           (if (andmap (lambda (n) (<= member n)) memo)
             (cons member memo)
             memo)) 
        '()
        lst))
    (eliminate-larger (list 1 2 3 5 4)) ;; (1 2 3 4)
    

    这无疑是一个幼稚的解决方案,因为您不得不在每次迭代时遍历整个累加器,但除了您的备忘录之外,您还可以轻松地保持一个最大值,并且每次都与该最大值进行比较。

    【讨论】:

    • 行得通,谢谢!我正在尝试了解 andmap 的工作原理,但并没有完全遵循它的工作原理。
    • andmap 用于验证 member&lt;= 累加器列表中的每个元素。与使用 filter 之类的函数相比,如果提供的 proc 的 any 应用程序返回 #f(例如 (&lt;= 5 4)),则它具有提前返回的额外好处。
    • @KeithCalderwood 如果您对这个答案感到满意,您介意接受吗?
    【解决方案2】:

    以下作品:

    (define  (el lst)
      (define  (inner x lsti)
        (if(empty? lsti) (list x)
           (if(<= x (apply max lsti))
              (cons x lsti)
              lsti)))
      (foldr inner '() lst))
    
    (el (list 1 2 3 5 4))
    

    输出:

    '(1 2 3 4)
    

    条件版本可能更可取:

    (define  (el lst)
      (define  (inner x lsti)
        (cond 
          [(empty? lsti) (list x)]
          [(<= x (apply max lsti))  (cons x lsti)]
          [else lsti]  ))
      (foldr inner '() lst) )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-07
      • 2021-07-17
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多