¿Siempre puedes convertir una función recursiva en una iterativa? Sí, absolutamente, y la tesis de Church-Turing lo demuestra si la memoria sirve. En términos simples, establece que lo que es computable por funciones recursivas es computable por un modelo iterativo (como la máquina de Turing) y viceversa. La tesis no te dice con precisión cómo hacer la conversión, pero sí dice que definitivamente es posible.
En muchos casos, convertir una función recursiva es fácil. Knuth ofrece varias técnicas en "El arte de la programación de computadoras". Y a menudo, una cosa calculada recursivamente puede calcularse mediante un enfoque completamente diferente en menos tiempo y espacio. El ejemplo clásico de esto son los números de Fibonacci o sus secuencias. Seguramente has encontrado este problema en tu plan de estudios.
En el reverso de esta moneda, ciertamente podemos imaginar un sistema de programación tan avanzado como para tratar una definición recursiva de una fórmula como una invitación a memorizar resultados anteriores, ofreciendo así el beneficio de velocidad sin la molestia de decirle a la computadora exactamente qué pasos debe seguir. seguir en el cálculo de una fórmula con una definición recursiva. Dijkstra casi seguramente imaginó tal sistema. Pasó mucho tiempo tratando de separar la implementación de la semántica de un lenguaje de programación. Por otra parte, sus lenguajes de programación no deterministas y multiprocesamiento están en una liga superior al programador profesional en ejercicio.
En el análisis final, muchas funciones son simplemente más fáciles de entender, leer y escribir en forma recursiva. A menos que haya una razón convincente, probablemente no debería convertir (manualmente) estas funciones a un algoritmo explícitamente iterativo. Su computadora manejará ese trabajo correctamente.
Puedo ver una razón convincente. Supongamos que tiene un sistema prototipo en un lenguaje de nivel súper alto como [ ponerse ropa interior de asbesto ] Esquema, Lisp, Haskell, OCaml, Perl o Pascal. Suponga que las condiciones son tales que necesita una implementación en C o Java. (Quizás sea política.) Entonces, ciertamente, podría tener algunas funciones escritas de forma recursiva, pero que, traducidas literalmente, explotarían su sistema de tiempo de ejecución. Por ejemplo, es posible una recursión de cola infinita en Scheme, pero el mismo idioma causa un problema para los entornos C existentes. Otro ejemplo es el uso de funciones léxicamente anidadas y alcance estático, que Pascal admite pero C no.
En estas circunstancias, puede intentar superar la resistencia política al idioma original. Puede que te encuentres reimplementando a Lisp, como en la décima ley de Greenspun (irónica). O puede que solo encuentre un enfoque de solución completamente diferente. Pero en cualquier caso, seguramente hay una manera.