Переверните список в схеме с помощью foldl и foldr

Как вы можете определить функцию для обратного списка в Схеме, используяfoldr а также ?foldl

То, что мы хотим, это краткое решение, чтобы перевернуть список в схеме, используяfoldl вызов и другое решение с использованиемfoldr вызов, как определено:

(define (foldl operation lst initial)
    (if (null? lst) initial
        (foldl operation 
               (cdr lst) 
               (operation (car lst) initial))))

а также

(define (foldr operation lst initial)
    (if (null? lst) initial
        (operation 
            (car lst) 
            (foldr operation (cdr lst) initial))))

Проницательный человек заметит, чтоfoldl реализация является рекурсивной, поскольку возвращаемое значение вычисляется при вызове каждого рекурсивного шага - на последнем шаге весь ответ уже вычисляется и просто возвращается по цепочке.

foldr реализация не является хвостовой рекурсией, потому что она должна построить возвращаемое значение, используя значения, которые передаются обратно по рекурсивной цепочке.

Поэтому две реализации Схемы, которые нас интересуют, должны иметь следующую форму:

(define (rev1 lst)
    (foldl ___________________________

**Solution:**
(define (rev1 lst)
    (foldl cons lst '()))

а также

(define (rev2 lst)
    (foldr ___________________________

**Solution 1:**
(define (rev2 lst)
    (foldr 
       (lambda (element accumulator) 
               (foldr cons accumulator (cons element '())))
       lst '())) 

**Solution 2:**
(define (rev2 lst)
    (foldr 
       (lambda (element accumulator) 
               (append accumulator (cons element '())))
       lst '())) 

Конечная цель состоит в том, чтобы иметь возможность назвать следующее,

(rev1 '(1 2 3)) -> (3 2 1)
(rev2 '(1 2 3)) -> (3 2 1)

foldl Решение должно быть относительно тривиальным (на основе нашей интуиции), ноfoldr Решение, вероятно, потребует дополнительной мысли.

Предыдущие вопросы, похожие (но гораздо менее задокументированные) на этот вопрос, остались без ответа и / или закрыты.

Ответы на вопрос(2)

Ваш ответ на вопрос