在Scheme中使用foldl实现函数foldr

use*_*976 1 scheme functional-programming racket

foldr(fold-right) 基本上是按列表中存储的值从右到左的顺序执行递归计算。并且foldl是相反的foldr。我想知道人们可以foldr使用 来实现该功能foldl吗?任何想法都表示赞赏,提前致谢。

Tha*_*you 5

\n

我想知道人们可以foldr使用foldl...来实现该功能吗?

\n
\n\n

foldl从左到右 \xe2\x80\x93 遍历列表一次,它也是尾递归的

\n\n
(define (foldl f acc xs)\n  (if (null? xs)\n      acc\n      (foldl f\n             (f acc (car xs))\n             (cdr xs))))\n
Run Code Online (Sandbox Code Playgroud)\n\n

foldr遍历列表一次,将调用堆叠起来,f直到列表的最后一个元素 \xe2\x80\x93 它不是尾递归

\n\n
(define (foldr f acc xs)\n  (if (null? xs)\n      acc\n      (f (foldr f acc (cdr xs))\n         (car xs))))\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们在 \xe2\x80\x93 下面验证他们的输出

\n\n
(foldl list 'init '(a b c))\n;; '(((init a) b) c)\n\n(foldr list 'init '(a b c))\n;; '(((init c) b) a)\n
Run Code Online (Sandbox Code Playgroud)\n\n

当然,您可以foldr使用reverseand来实现foldl,但这将遍历输入列表两次。每个折叠存在的原因是,您可以在任一方向处理列表,而无需多次遍历它......

\n