Al programar en Java (o en cualquier otro lenguaje de procedimiento para el caso), a menudo elijo entre resolviendo algo recursivamente frente a resolviéndolo iterativamente. La opción recursiva es a menudo más elegante que una solución iterativa, por lo que generalmente utilizo la solución recursiva. Con una excepción:¿Está bien que la profundidad de la pila sea proporcional a algún tamaño de entrada?
Preocupación por los desbordamientos de la pila Tiendo a evitar soluciones recursivas si la profundidad máxima de la pila es linealmente proporcional al tamaño de la entrada (o algo peor). Sin embargo, me doy cuenta de que en muchos otros lenguajes (incluso los que apuntan a la JVM como Scala y Clojure) muchos algoritmos, como los algoritmos de lista básica, por ejemplo, se expresan recursivamente cuando la profundidad máxima de la pila es proporcional a la longitud de la lista. (1) Entonces, ¿están justificadas mis preocupaciones sobre los desbordamientos de pila en linear-stack-depth-algorithms?
TL; DR: ¿Qué "complejidad de profundidad de pila" se considera razonable? complejidad logarítmica, recursiva de búsqueda binaria, por ejemplo, O (log N) es sin duda bien, pero ¿qué hay de O (N), O (N log N), O (N 2 )? ¿Dónde dibujarías normalmente la línea? (2)
(1) Soy consciente de que estas lenguas a veces apoya cosas como @tailrec, pero esta pregunta se refiere a Java, C#, etc.
(2) Tenga en cuenta que no estoy preocupado por sobrecarga de la CPU etc. Solo la profundidad de la pila.
La complejidad de la profundidad de la pila es una cosa a considerar, pero otra cosa es el tamaño de la entrada en sí. Si el problema excluye la entrada grande de su dominio (para el período de tiempo extendido en el desarrollo), entonces podemos optar por una solución recursiva (suponiendo que la complejidad no excede la capacidad de la pila). Si el tamaño de entrada no está definido, O (1) profundidad de la pila o O (log N) profundidad de la pila es aceptable IMO (O (log N) puede no ser aceptable si el límite superior ** práctico ** en el tamaño de entrada incluso se rompe el tamaño de la pila, pero creo que este caso sería bastante raro). – nhahtdh
"La opción recursiva suele ser más elegante que una solución iterativa" En el 90% de los casos, encuentro lo contrario. Podría depender del tipo de problema que intente resolver y con qué estilo se sienta más cómodo. ;) Normalmente me siento cómodo con o (log N) profundidad recursiva. –
Esto es [tag: language-agnostic] –