Мне интересно, могли бы люди реализовать функцию 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))))
Мы проверяем их вывод ниже -
(foldl list 'init '(a b c))
;; '(((init a) b) c)
(foldr list 'init '(a b c))
;; '(((init c) b) a)
Так что вы, конечно, могли бы реализовать foldr
, используя reverse
и foldl
, но это дважды обойдёт список ввода.Причина существования каждого сгиба заключается в том, что вы можете обрабатывать список в любом направлении, не просматривая его более одного раза ...