【发布时间】: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