(define (my-reverse ls)
(define (my-reverse-2 ls acc)
(if (null? ls)
acc
(my-reverse-2 (cdr ls) (cons (car ls)) acc)))
(my-reverse-2 ls '()))
Este utiliza una variable acumulador para revertir la lista, teniendo el primer elemento de la lista de entrada y Consing a la parte delantera del acumulador. Oculta la función de toma del acumulador y solo expone la función que toma una lista, por lo que la persona que llama no tiene que pasar la lista vacía. Es por eso que tengo my-reverse-2.
(my-reverse-2 '(a (b c d) e) '()); will call
(my-reverse-2 '((b c d) e) '(a)); which will call
(my-reverse-2 '(e) '((b c d) a)); which will call
(my-reverse-2 '() '(e (b c d) a)); which will return
'(e (b c d) a)
Debido a que la última llamada a la función en my-reverse-2
es una llamada a my-reverse-2
, y el valor de retorno se pasó a través de (el valor de retorno de la primera llamada es el valor de retorno de la segunda llamada, etc.) my-reverse-2
es cola optimizada, lo que significa que no se quedará sin espacio en la pila. Por lo tanto, es seguro llamar a esto con una lista todo el tiempo que desee.
Si desea que se aplique a las listas anidadas usar algo como esto:
(define (deep-reverse ls)
(define (deep-reverse-2 ls acc)
(if (null? ls)
acc
(if (list? (car ls))
(deep-reverse-2 (cdr ls) (cons (deep-reverse (car ls)) acc))
(deep-reverse-2 (cdr ls) (cons (car ls) acc)))))
(deep-reverse-2 ls '()))
Esto comprueba si el elemento es una lista antes de añadir a la lista, y si lo es, se invierte por primera vez . Como se llama a sí mismo para invertir la lista interna, puede manejar la anidación arbitraria.
(deep-reverse '(a (b c d) e))
->'(e (d c b) a)
que está en orden alfabético inverso, a pesar de que hay una lista anidada. evalúa como tal:
(deep-reverse-2 '(a (b c d) e) '()); Which calls
(deep-reverse-2 '((b c d) e) '(a))
(deep-reverse-2 '(e) (cons (deep-reverse-2 '(b c d) '()) '(a)))
(deep-reverse-2 '(e) (cons (deep-reverse-2 '(c d) '(b)) '(a)))
(deep-reverse-2 '(e) (cons (deep-reverse-2 '(d) '(c b)) '(a)))
(deep-reverse-2 '(e) (cons '(d c b) '(a)))
(deep-reverse-2 '(e) '((d c b) a))
(deep-reverse-2 '() '(e (d c b) a))
'(e (d c b) a)
respuesta mejor: (define (LST Rev1) (foldl cons '(LST))) – wowest