Racket中的Reduce函数是什么?

11

我在Racket中已经被这个任务困扰了5天,有人知道我该如何解决吗?

给定一个二元函数和一个包含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)))

2
样例输出似乎不正确,请检查是否正确。另外,请发布zip的实现。 - Óscar López
3个回答

12

请看这里。

(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))

哎呀,被狙击手击中了。甚至在回答正确的情况下也没有解释就被踩了。来吧! - GoZoner
2
你说得对,答案看起来是正确的。给你。 :) 我不明白为什么 [tag:scheme] 的人不互相点赞,我们这里并没有很大的观众群体。你能展示一下 zip 的定义吗?或者你是在使用内置函数?(显然是 (define (zip a b) (map list a b)),但为了完整起见,它应该包含在答案中)。 - Will Ness
谢谢。同一用户在实现zip方面提出了问题。请参见https://dev59.com/_3zaa4cB1Zd3GeqPOlbt - GoZoner
1
已经完成翻译。 :) 鉴于这可能是作业,不建议提供完整的代码... :) ...所以你的意思是你在这里使用的是与之前相同的“zip”?或许还是将代码(或其框架)包含在此处比较好。 (?) - Will Ness

9

你可以用foldl来表达它:

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

2
(define reduce
  (λ (f init ls)
    (if (empty? ls)
        init
        (reduce f (f init (first ls)) (rest ls)))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接