我在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)))
我在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)))
请看这里。
(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))
zip
的定义吗?或者你是在使用内置函数?(显然是 (define (zip a b) (map list a b))
,但为了完整起见,它应该包含在答案中)。 - Will Nesszip
方面提出了问题。请参见https://dev59.com/_3zaa4cB1Zd3GeqPOlbt - GoZoner你可以用foldl
来表达它:
(define (reduce f xs)
(and (not (empty? xs)) (foldl f (first xs) (rest xs))))
(define reduce
(λ (f init ls)
(if (empty? ls)
init
(reduce f (f init (first ls)) (rest ls)))))
zip
的实现。 - Óscar López