首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用高阶函数重写这些(使用Dr.Racket)

如何使用高阶函数重写这些(使用Dr.Racket)
EN

Stack Overflow用户
提问于 2020-12-01 15:48:55
回答 1查看 219关注 0票数 0

这是我的作业,但我们只允许使用过滤器、map、foldr、排序、构建列表和lambda来代替显式递归

我怎么才能重写这些,使用上面那些高阶函数来不让函数调用自己。

我现在拥有的是:

代码语言:javascript
复制
(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)])) ```
EN

回答 1

Stack Overflow用户

发布于 2020-12-01 17:00:54

是。worthless可以用map重写。假设我们有一个函数,它为列表中的每个元素添加了3个:

代码语言:javascript
复制
(define (add3 lst)
  (if (null? lst)
      '()
      (cons (+ (car lst) 3)
            (add3 (cdr lst)))))

一个列表的地图如下所示:

代码语言:javascript
复制
(define (map f lst)
  (if (null? lst)
      '()
      (cons (f (car lst))
            (map f (cdr lst))))

看看这些,您可以看到,带map的add3只需要集中精力添加3。基本上,您需要传递一个函数,其中包含一个参数,该参数添加了3个参数:

代码语言:javascript
复制
(define (add3-wm lst)
  (map (lambda (v) (+ v 3)) lst))

现在,一个列表的foldr如下所示:

代码语言:javascript
复制
(define (foldr f init lst)
  (if (null? lst)
      init
      (f (car lst)
         (foldr f init (cdr lst)))))

在这里,您可以看到cons还没有完成,因此使用foldr重写add3需要一个组合器,它需要在第一个参数中添加3个,并将第二个参数与后面的元素组合在一起,其中第二个参数是同一个过程的结果。

代码语言:javascript
复制
(define (add3-fr lst)
  (define (combiner v acc)
    (cons (+ v 3) acc))
  (foldr combiner '() lst))

实际上,在这里使用foldr是过火的,但如果有时需要像working-group那样跳过一个元素,那将是很有趣的。在这种情况下,组合器只返回第二个参数。你可以用filter制作foldr

代码语言:javascript
复制
(define (filter f lst)
  (foldr (lambda (v acc)
           (if (f v)
               (cons v acc)
               acc))
         '()
         lst))

祝好运

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65093829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档