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))))\nRun 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))))\nRun 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)\nRun Code Online (Sandbox Code Playgroud)\n\n当然,您可以foldr使用reverseand来实现foldl,但这将遍历输入列表两次。每个折叠存在的原因是,您可以在任一方向处理列表,而无需多次遍历它......