use*_*976 1 scheme functional-programming racket
foldr
(fold-right) 基本上是按列表中存储的值从右到左的顺序执行递归计算。并且foldl
是相反的foldr
。我想知道人们可以foldr
使用 来实现该功能foldl
吗?任何想法都表示赞赏,提前致谢。
\n\n\n我想知道人们可以
\nfoldr
使用foldl
...来实现该功能吗?
foldl
从左到右 \xe2\x80\x93 遍历列表一次,它也是尾递归的
(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\nfoldr
遍历列表一次,将调用堆叠起来,f
直到列表的最后一个元素 \xe2\x80\x93 它不是尾递归
(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
使用reverse
and来实现foldl
,但这将遍历输入列表两次。每个折叠存在的原因是,您可以在任一方向处理列表,而无需多次遍历它......