我必须使用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之后的其余数字?
答案 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) )