Odwróć listę w schemacie za pomocą foldl i foldr

Jak zdefiniować funkcję odwracania listy w schemacie za pomocąfoldr ifoldl?

To, czego chcemy, to zwięzłe rozwiązanie odwrócenia listy w schemacie za pomocąfoldl zadzwoń i inne rozwiązanie za pomocąfoldr zadzwoń, jak zdefiniowano:

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

i

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

Wnikliwa osoba zauważy, żefoldl implementacja jest rekurencyjna, ponieważ zwracana wartość jest obliczana w momencie wywołania każdego kroku rekurencyjnego - w ostatnim kroku cała odpowiedź jest już obliczona i po prostu zwrócona w górę łańcucha.

Thefoldr implementacja nie jest rekurencyjna, ponieważ musi budować zwracaną wartość przy użyciu wartości, które są przekazywane z powrotem do łańcucha rekurencyjnego.

Dlatego dwie implementacje schematu, które nas interesują, powinny mieć następującą formę,

(define (rev1 lst)
    (foldl ___________________________

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

i

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

Ostatecznym celem jest możliwość wywołania następujących elementów,

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

Thefoldl rozwiązanie powinno być stosunkowo trywialne (oparte na naszej intuicji), alefoldr rozwiązanie będzie prawdopodobnie wymagało więcej przemyśleń.

Poprzednie pytania podobne (ale znacznie mniej udokumentowane) do tego pytania zakończyły się bez odpowiedzi i / lub zamknięte.

questionAnswers(2)

yourAnswerToTheQuestion