Es posible reemplazar la recursión por iteración más memoria ilimitada .
Si solo tiene iteración (digamos, bucles while) y una cantidad finita de memoria, entonces todo lo que tiene es un autómata finito. Con una cantidad finita de memoria, el cálculo tiene un número finito de pasos posibles, por lo que es posible simularlos a todos con un autómata finito.
Tener memoria ilimitada cambia el trato. Esta memoria ilimitada puede tomar muchas formas que resultan tener un poder expresivo equivalente. Por ejemplo, una máquina Turing lo mantiene simple: hay una sola cinta, y la computadora solo puede avanzar o retroceder en la cinta paso a paso, pero eso es suficiente para hacer cualquier cosa que pueda hacer con las funciones recursivas.
Una máquina de Turing puede verse como un modelo idealizado de una computadora (máquina de estados finitos) con algo de almacenamiento adicional que crece bajo demanda. Tenga en cuenta que es crucial que no solo no haya un límite finito en la cinta, sino que incluso dada la entrada, no puede predecir de manera confiable cuánta cinta se necesitará. Si pudiera predecir (es decir, calcular) cuánta cinta se necesita a partir de la entrada, entonces podría decidir si la computación se detendría calculando el tamaño máximo de la cinta y luego tratando todo el sistema, incluida la cinta ahora finita, como una máquina de estados finitos .
Otra forma de simular una máquina Turing con computadoras es la siguiente. Simule la máquina Turing con un programa de computadora que almacena el comienzo de la cinta en la memoria. Si el cálculo llega al final de la parte de la cinta que cabe en la memoria, reemplace la computadora por una computadora más grande y vuelva a ejecutar el cálculo.
Ahora suponga que desea simular un cálculo recursivo con una computadora. Las técnicas para ejecutar funciones recursivas son bien conocidas: cada llamada a la función tiene una pieza de memoria, llamada marco de pila . De manera crucial, las funciones recursivas pueden propagar información a través de múltiples llamadas al pasar variables. En términos de implementación en una computadora, eso significa que una llamada de función podría acceder al marco de la pila de una llamada (grand-) * parent.
Una computadora es un procesador, una máquina de estados finitos (con una gran cantidad de estados, pero aquí estamos haciendo la teoría de la computación, por lo que todo lo que importa es que es finita), junto con una memoria finita. El microprocesador ejecuta un bucle while gigante: "mientras está encendido, lea una instrucción de la memoria y ejecútela". (Los procesadores reales son mucho más complejos que eso, pero no afecta lo que pueden calcular, solo lo rápido y conveniente que lo hacen). Una computadora puede ejecutar funciones recursivas con solo este ciclo while para proporcionar iteración, más el mecanismo para acceder a la memoria, incluida la capacidad de aumentar el tamaño de la memoria a voluntad.
Si restringe la recursividad a la recursividad primitiva, puede restringir la iteración a la iteración acotada . Es decir, en lugar de usar bucles while con un tiempo de ejecución impredecible, puede usar bucles donde el número de iteraciones se conoce al comienzo del bucle¹. El número de iteraciones puede no conocerse al comienzo del programa: puede haber sido calculado por bucles anteriores.
Ni siquiera voy a esbozar una prueba aquí, pero hay una relación intuitiva entre pasar de la recursividad primitiva a la recursividad completa y pasar de bucles a bucles while: en ambos casos, implica no saber de antemano cuándo detener. Con una recursión completa, esto se hace con el operador de minimización, donde continúa hasta que encuentra un parámetro que satisfaga la condición. Con los bucles while, esto se lleva a cabo hasta que se cumpla la condición del bucle.
¹ los bucles en lenguajes tipo C pueden realizar una iteración ilimitada de la misma manera , es solo una cuestión de convención restringirlos a la iteración acotada. Cuando la gente habla de "for loops" en la teoría de la computación, eso significa solo loops que cuentan de 1 a n (o equivalente). for
while
norte