foldr - 添加两个列表的压缩元素
foldr - adding zipped elements of two lists
我很难理解 foldr 的功能。我正在做作业,我们应该构建一个函数(不需要 foldr),它压缩两个列表的元素 (f.e。'(1 2 3) (4 5 6) -> (1 4 ) (2 5) (3 6).
到目前为止效果还不错:
(define (zip list1 list2)
(cond
[(or (empty? list1) (empty? list2)) '()]
[else (cons (list (car list1) (car list2)) (zip (cdr list1) (cdr list2)))]))
但现在我必须构建一个函数,它使用我之前制作的 zip 函数并将两个列表与一个函数 f 和 return 组合为一个列表。 (fe. (zipfunction + '( 1 2) '(3 4) -> (4 6)
我了解了 foldr 的基本概念,它将递归地将我提供的函数从右到左应用于列表,但我无法理解如何使用多个列表和多个函数以及是否需要累加器是否可变。
有人可以帮我吗?
提前致谢!
更自然的答案是使用 map
:
(map + '(1 2) '(3 4))
当然,一个map
可以用foldr
表示:
(foldr (lambda (x y acc)
(cons (+ x y) acc))
'()
'(1 2)
'(3 4))
使用foldr
时你应该记住的是,它使用一个或多个列表作为输入,它的每个元素都作为参数传递给一个过程,在那个过程中,累积的结果也是作为具有指定初始值的参数传递(在本例中为空列表);由您决定如何组合/累加过程中的参数以产生结果。
我很难理解 foldr 的功能。我正在做作业,我们应该构建一个函数(不需要 foldr),它压缩两个列表的元素 (f.e。'(1 2 3) (4 5 6) -> (1 4 ) (2 5) (3 6).
到目前为止效果还不错:
(define (zip list1 list2)
(cond
[(or (empty? list1) (empty? list2)) '()]
[else (cons (list (car list1) (car list2)) (zip (cdr list1) (cdr list2)))]))
但现在我必须构建一个函数,它使用我之前制作的 zip 函数并将两个列表与一个函数 f 和 return 组合为一个列表。 (fe. (zipfunction + '( 1 2) '(3 4) -> (4 6)
我了解了 foldr 的基本概念,它将递归地将我提供的函数从右到左应用于列表,但我无法理解如何使用多个列表和多个函数以及是否需要累加器是否可变。
有人可以帮我吗?
提前致谢!
更自然的答案是使用 map
:
(map + '(1 2) '(3 4))
当然,一个map
可以用foldr
表示:
(foldr (lambda (x y acc)
(cons (+ x y) acc))
'()
'(1 2)
'(3 4))
使用foldr
时你应该记住的是,它使用一个或多个列表作为输入,它的每个元素都作为参数传递给一个过程,在那个过程中,累积的结果也是作为具有指定初始值的参数传递(在本例中为空列表);由您决定如何组合/累加过程中的参数以产生结果。