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.