如何在Racket中使用foldr来消除列表中大于任何后续数字的数字

时间:2016-09-10 20:27:27

标签: racket fold higher-order-functions

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

示例:(消除 - 更大(列表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)
)

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

2 个答案:

答案 0 :(得分: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)

这无疑是一个天真的解决方案,因为您每次迭代都被迫遍历整个累加器,但除了备忘录之外,您还可以轻松维护最大值,并且每次都要与之进行比较。 / p>

答案 1 :(得分:0)

以下作品:

(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)

cond版本可能更可取:

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