这是我的作业,但我们只允许使用过滤器、map、foldr、排序、构建列表和lambda来代替显式递归。
我怎么才能重写这些,使用上面那些高阶函数来不让函数调用自己。
我现在拥有的是:
(define (worthless loc name)
(cond
[(empty? loc) loc]
[(equal? name (coin-name (first loc))) (cons (make-coin (coin-name (first loc)) 0) (worthless (rest loc) name))]
[else (cons (first loc) (worthless (rest loc) name))]))
(define (working-group locations group-tz)
(cond
[(empty? locations) empty]
[(and (equal? (utc-hours group-tz) (utc-hours (location-timezone (first locations)))) (equal? (utc-sign group-tz) (utc-sign (location-timezone (first locations)))))
(cons (location-city (first locations)) (working-group (rest locations) group-tz))]
[(and (equal? (add1 (utc-hours group-tz)) (utc-hours (location-timezone (first locations))))
(equal? (utc-sign group-tz) (utc-sign (location-timezone (first locations))))
(equal? (utc-mins group-tz) (utc-mins (location-timezone (first locations)))))
(cons (location-city (first locations)) (working-group (rest locations) group-tz))]
[(and (equal? (sub1 (utc-hours group-tz)) (utc-hours (location-timezone (first locations))))
(equal? (utc-sign group-tz) (utc-sign (location-timezone (first locations))))
(equal? (utc-mins group-tz) (utc-mins (location-timezone (first locations)))))
(cons (location-city (first locations)) (working-group (rest locations) group-tz))]
[else (working-group (rest locations) group-tz)])) ```发布于 2020-12-01 17:00:54
是。worthless可以用map重写。假设我们有一个函数,它为列表中的每个元素添加了3个:
(define (add3 lst)
(if (null? lst)
'()
(cons (+ (car lst) 3)
(add3 (cdr lst)))))一个列表的地图如下所示:
(define (map f lst)
(if (null? lst)
'()
(cons (f (car lst))
(map f (cdr lst))))看看这些,您可以看到,带map的add3只需要集中精力添加3。基本上,您需要传递一个函数,其中包含一个参数,该参数添加了3个参数:
(define (add3-wm lst)
(map (lambda (v) (+ v 3)) lst))现在,一个列表的foldr如下所示:
(define (foldr f init lst)
(if (null? lst)
init
(f (car lst)
(foldr f init (cdr lst)))))在这里,您可以看到cons还没有完成,因此使用foldr重写add3需要一个组合器,它需要在第一个参数中添加3个,并将第二个参数与后面的元素组合在一起,其中第二个参数是同一个过程的结果。
(define (add3-fr lst)
(define (combiner v acc)
(cons (+ v 3) acc))
(foldr combiner '() lst))实际上,在这里使用foldr是过火的,但如果有时需要像working-group那样跳过一个元素,那将是很有趣的。在这种情况下,组合器只返回第二个参数。你可以用filter制作foldr
(define (filter f lst)
(foldr (lambda (v acc)
(if (f v)
(cons v acc)
acc))
'()
lst))祝好运
https://stackoverflow.com/questions/65093829
复制相似问题