Reverter uma lista no esquema com foldl e foldr

Como você pode definir uma função para reverter uma lista no Scheme usandofoldr efoldl?

O que queremos é uma solução sucinta para reverter uma lista no Scheme usando umfoldl chamar e uma solução diferente usando umfoldr chamada, conforme definido:

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

e

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

A pessoa astuta observará que ofoldl A implementação é recursiva de cauda porque o valor retornado é computado à medida que cada etapa recursiva é chamada - na última etapa, a resposta inteira já está computada e simplesmente retornou à cadeia.

ofoldr A implementação não é tail-recursiva porque deve construir o valor retornado usando os valores que são passados ​​de volta para a cadeia recursiva.

Portanto, as duas implementações do Scheme em que estamos interessados ​​devem estar na seguinte forma,

(define (rev1 lst)
    (foldl ___________________________

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

e

(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 '())) 

O objetivo final é poder chamar o seguinte,

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

ofoldl solução deve ser relativamente trivial (com base em nossa intuição), mas afoldr solução provavelmente irá exigir um pouco mais de pensamento.

Perguntas anteriores semelhantes (mas muito menos documentadas) a esta questão acabaram sem resposta e / ou encerradas.

questionAnswers(2)

yourAnswerToTheQuestion