functional-programming - 在 Scheme 中使用 foldl 实现函数 foldr
问题描述
foldr
(fold-right) 基本上是递归计算以存储在列表中的值的从右到左的顺序执行。并且foldl
是 的倒数foldr
。我想知道人们可以foldr
使用来实现该功能foldl
吗?任何想法都值得赞赏,在此先感谢。
解决方案
我想知道人们可以
foldr
使用foldl
...实现该功能
foldl
从左到右遍历列表一次——它也是尾递归的
(define (foldl f acc xs)
(if (null? xs)
acc
(foldl f
(f acc (car xs))
(cdr xs))))
foldr
遍历列表一次,将调用堆叠起来f
直到列表的最后一个元素——它不是尾递归的
(define (foldr f acc xs)
(if (null? xs)
acc
(f (foldr f acc (cdr xs))
(car xs))))
我们在下面验证他们的输出——</p>
(foldl list 'init '(a b c))
;; '(((init a) b) c)
(foldr list 'init '(a b c))
;; '(((init c) b) a)
当然,您可以foldr
使用reverse
and来实现foldl
,但这将遍历输入列表两次。每个折叠存在的原因是您可以在任一方向处理列表而无需多次遍历它...
推荐阅读
- java - java流分组并在一次迭代中找到前10名
- python - 在 pandas 数据框中实现多个 if else 条件
- bash - 将 bash 启动文件带入 ssh?
- java - 从 PCollection 获取单个字段
- python - AssertionError: .validate() 应该返回经过验证的数据
- javascript - ForEach 在 Firebase Cloud Functions 中不起作用
- javascript - 将 JSON 对象从网页发送到 Android 应用
- oracle - 在 PLSQL 的复杂查询中使用示例函数
- ios - 我可以在 Objective C 中获取代码点的 Unicode 类别吗?
- java - 当我调用 UserTransaction.begin() 时发生了什么?