【问题标题】:Reduce function in Racket?减少球拍中的功能?
【发布时间】:2014-03-08 10:30:51
【问题描述】:

我在 Racket 中被这个任务卡住了 5 天,有人知道我该如何处理吗?

给定一个 arity 2 的函数和一个 n 元素列表,返回所有元素的字符串函数的求值,例如:

>(reduce + '(1 2 3 4 5 6 7 8 9 10))

55

> (reduce zip '((1 2 3) (4 5 6) (7 8 9)))
'((1 (4 7)) (2 (5 8)) (3 (6 9)))

【问题讨论】:

  • 示例输出似乎不正确,请检查是否正确。另外,贴出zip的实现。

标签: recursion functional-programming scheme racket


【解决方案1】:

给你。

(define (reduce func list)
  (assert (not (null? list)))
  (if (null? (cdr list))
      (car list)
      (func (car list) (reduce func (cdr list)))))

测试:

> (reduce + '(1 2 3 4 5 6 7 8 9 10))
55
> (reduce zip '((1 2 3) (4 5 6) (7 8 9)))
((1 (4 7)) (2 (5 8)) (3 (6 9)))

为了完整起见,zip 的实现(假设两个列表并且您的列表长度相同)是:

(define (zip l1 l2) (map list l1 l2))

【讨论】:

  • 哎呀,被狙击手击中了。在没有解释的情况下投了反对票 - 在正确答案上同样如此。带上它!
  • 你是对的,答案似乎是正确的。给你。 :) 为什么scheme 中的人不要互相投票,我不明白。这不像我们在这里有很多观众。你能通过zip 的定义来说明吗?还是您使用的是内置的? (嗯,显然是(define (zip a b) (map list a b)),但为了完整起见,它可能应该在答案中)。
  • 谢谢。同一个用户问了一个关于实现zip 的问题。见stackoverflow.com/questions/21688944/…
  • 已经做到了。 :) 这被认为是家庭作业,因此不建议提供完整的代码... :) ...所以您的意思是您在这里使用的 zip 与您在此处提供的相同?在这里也包含代码(或其框架)可能会更好。 (?)
【解决方案2】:

你可以用foldl来表达:

(define (reduce f xs)
  (and (not (empty? xs)) (foldl f (first xs) (rest xs))))

【讨论】:

    【解决方案3】:
    (define reduce
      (λ (f init ls)
        (if (empty? ls)
            init
            (reduce f (f init (first ls)) (rest ls)))))
    

    【讨论】:

      猜你喜欢
      • 2019-07-31
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多