¿Cuáles son las desventajas de las funciones recursivas?

En algunos casos, las funciones recursivas pueden ser mucho peores que sus contrapartes iterativas, especialmente en lenguajes imperativos como C / C ++ / Java, que no tienen optimización de llamadas de cola.

Sigue una descripción simplificada de Tail-Call Optimization y su aplicación para reducir la sobrecarga de recursividad.

La recursión implica la sobrecarga: asignación de marco de pila, desasignación y otras llamadas de función, pero si la declaración recursiva es la última declaración de una función, en algunos casos es posible usar el marco de pila del llamador y reemplazar la llamada de función con un goto o equivalente (por ejemplo, un bucle while con algunas variables que mantienen el estado fuera de su alcance), eliminando así la sobrecarga de la llamada de función, acelerando enormemente la recursión y, por último, lo más importante, evitando también los infames errores de desbordamiento de pila. recursión profunda o infinita, en efecto convirtiéndolas en un bucle.

Los lenguajes funcionales como Lisp, Haskell, Scheme, etc. tienen que hacer esta optimización de cola de manera agresiva, ya que carecen de construcciones de iteración como while y for , y la recursión es la única forma de hacer iteraciones en estos lenguajes.

Sin embargo, los lenguajes comunes de la industria como C / C ++ / Java son imprescindibles, y en su mayoría (¿totalmente?) Carecen de la optimización de las llamadas de cola para las funciones recursivas (al menos de forma predeterminada (sin indicadores de compilación para C / C ++)). Así que bienvenido: StackOverflowError , ejecución lenta y, por último, pero no menos importante, depuración complicada.

Ahora no me pregunte por qué su función de ordenación rápida en Java arroja el Error anterior al pasar una matriz de millones de Object .

More Interesting

Cómo usar el hash rodante y la búsqueda binaria para encontrar la subcadena común más larga

¿Es cierto que dado cualquier gráfico con N vértices es un subgrafo inducido del subconjunto gráfico (N). ¿Cómo puedes probarlo o refutarlo?

¿Cuál es la complejidad temporal de la solución del problema del vendedor ambulante mediante la optimización de colonias de hormigas?

Conozco estructuras de datos y algoritmos. ¿Cómo programo un compilador simple?

¿Cuál es la diferencia entre la mochila y los problemas de Cutting the Rod usando programación dinámica?

¿Cuáles son algunos ejemplos de software del mundo real de pilas, colas y deques?

¿Cuál es la complejidad del tiempo para la escalera de palabras?

Staad Pro: ¿Cómo puedo resolver este problema?

¿Qué algoritmos se utilizan para construir árboles filogenéticos?

Dados N cajas grandes y M cajas pequeñas de diferentes tamaños, ¿cómo elegir una caja grande óptima para empacar todas las cajas más pequeñas?

¿Cuál es la diferencia entre estos dos métodos de inicialización de matrices Java?

¿Cómo realizo la codificación de huffman usando lista enlazada?

¿Cuándo puede el paralelismo hacer que sus algoritmos se ejecuten más rápido? ¿Cuándo podría hacer que sus algoritmos funcionen más lentamente?

¿Por qué los finalistas de Topcoder no comparten su experiencia en los tutoriales de YouTube para principiantes? Cualquier principiante agradecería la ayuda para desarrollar sus habilidades para resolver problemas.

¿Qué otras formas fundamentales de compresión de datos, pero la omisión de patrones irrelevantes y la explotación de patrones repetitivos existen?