【问题标题】:foldr - adding zipped elements of two listsfoldr - 添加两个列表的压缩元素
【发布时间】:2017-06-29 18:32:33
【问题描述】:

我很难弄清楚 foldr 的功能。我正在做作业,我们应该构建一个函数(不需要 foldr),它压缩两个列表的元素(fe '(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 结合起来,并将它们作为一个列表返回。 (fe. (zipfunction + '( 1 2) '(3 4) -> (4 6)

我了解了 foldr 的基本概念,它将递归地将我提供的函数应用到从右到左的列表,但我无法理解如何处理多个列表和多个函数以及如果我需要一个累加器变量或不是。

有人可以帮我吗?

提前谢谢你!

【问题讨论】:

  • (define (zipadd f list1 list2) (map (lambda ..... ....f..... ) (zip list1 list2))),真正使用你的zip函数。

标签: list lambda scheme fold


【解决方案1】:

更自然的答案是使用map

(map + '(1 2) '(3 4))

当然,map 可以用foldr 表示:

(foldr (lambda (x y acc)
         (cons (+ x y) acc))
       '()
       '(1 2)
       '(3 4))

在使用foldr 时你应该记住的是,它使用一个或多个列表作为输入,并且它的每个元素都作为参数传递给过程,并且在该过程中,累积的结果也作为参数传递具有指定的初始值(在这种情况下为空列表);由您决定如何组合/累积过程中的参数以产生结果。

【讨论】:

  • 谢谢,这让我对 fold 的工作原理有了更清晰的了解!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
相关资源
最近更新 更多