tutorial sirve resueltos que programación programacion practicar para español ejercicios ejemplos desde cero python tail-recursion tail-call-optimization

sirve - Explíqueme cuál es el problema con la optimización de llamadas de cola y por qué Python lo necesita



que es python y para que sirve (5)

Aparentemente, ha habido un gran alboroto sobre si Python necesita o no la optimización de llamadas de cola. Esto llegó a un punto crítico cuando alguien le envió a Guido una copia de SICP porque él no "lo consiguió". Estoy en el mismo barco que Guido. Entiendo el concepto de optimización de llamadas de cola. Simplemente no puedo pensar en ninguna razón por la cual Python realmente lo necesita .

Para que esto me resulte más fácil de entender, ¿podría alguien darme un fragmento de código que se simplificaría enormemente utilizando el TCO?


Guido reconoció en una post seguimiento que el TCO permitió una implementación más limpia de la máquina de estados como una colección de funciones que se llamaban recursivamente. Sin embargo, en el mismo post, él propone una solución alternativa más limpia sin TCO.


He estado pensando en su pregunta durante años (créanlo o no ...). Me invirtió tanto en esta pregunta que finalmente escribí un artículo completo (que también es una presentación de uno de mis módulos que escribí hace algunos meses sin tomarme el tiempo para escribir una explicación precisa de cómo hacerlo). Si aún está interesado en esa pregunta, lea mi respuesta en mi blog . En dos palabras, doy una presentación del módulo tco ; no encontrará nada que no pueda hacer sin la eliminación de la recursión de la cola, pero puede que le interesen mis pensamientos al respecto.

Sé que los meros enlaces no son el uso preferido en ; No obstante, tenga en cuenta que escribí un artículo completo para responder a esta publicación (a la que me refiero en el cuerpo de mi artículo) e incluye también algunas imágenes para ilustrarlo. Por esta razón, publico aquí esta respuesta inusual.


Personalmente, pongo gran valor en la optimización de llamadas de cola; pero principalmente porque hace que la recursión sea tan eficiente como la iteración (o hace de la iteración un subconjunto de recursión). En lenguajes minimalistas, obtienes un gran poder expresivo sin sacrificar el rendimiento.

En un lenguaje ''práctico'' (como Python), OTOH, usualmente tienes muchas otras construcciones para casi todas las situaciones imaginables, por lo que es menos crítico. Siempre es algo bueno tener, para permitir situaciones imprevistas, por supuesto.


Si desea intensamente utilizar la recursión para cosas que, alternativamente, se pueden expresar como bucles, entonces la "optimización de la llamada de cola" es realmente una necesidad. Sin embargo, Guido, el dictador benevolente para la vida de Python (BDFL), cree firmemente en que los bucles se expresen como bucles, por lo que no va a llamadas de cola de casos especiales (sacrificando volcados de pila y depuración de regularidad).


La optimización de llamadas de cola facilita la escritura de funciones recursivas sin preocuparse por un desbordamiento de pila:

def fac(n, result=1): if n > 1: return fac(n - 1, n * result) return result

Sin la optimización de la llamada de cola, llamar a esto con un número grande podría desbordar la pila.