reemplaza las llamadas de función con argumentos de empuje en una pila, y regresa con estallar de la pila, y has eliminado la recursión.
Editar: en respuesta a "por medio de una pila no disminuye los costes de espacio"
Si un algoritmo recursivo puede funcionar en el espacio constante, se puede escribir de una manera recursiva de cola. si está escrito en formato recursivo de cola, entonces cualquier compilador decente puede colapsar la pila. Sin embargo, esto significa que el método "convertir funciones llama a apilar paquetes explícitos" también requiere espacio constante también. Como ejemplo, vamos a tomar factorial.
factorial:
def fact_rec(n):
' Textbook Factorial function '
if n < 2: return 1
else: return n * f(n-1)
def f(n, product=1):
' Tail-recursive factorial function '
if n < 2: return product
else: return f(n-1, product*n)
def f(n):
' explicit stack -- otherwise same as tail-recursive function '
stack, product = [n], 1
while len(stack):
n = stack.pop()
if n < 2: pass
else:
stack.append(n-1)
product *= n
return product
porque el stack.pop() sigue el stack.append() en el bucle, la pila no tiene más de un elemento en él, y por lo que cumple con la constante de espacio requisito. Si imagina usar una variable de temperatura en lugar de una pila de 1 de longitud, se convierte en su algoritmo factorial iterativo estándar.
Por supuesto, hay funciones recursivas que no se pueden escribir en formato recursivo de cola. Todavía puede convertir a formato iterativo con algún tipo de pila, pero me sorprendería si hubiera garantías sobre la complejidad del espacio.
que depende de lo que llame recursivo. cada función recursiva se puede traducir a una no recursiva implementando una pila. – yairchu
Sí; se describe en detalle aquí: http://stackoverflow.com/questions/1094679/ –
@Marc Gravell: ¡Eso es absolutamente genial! –