C: ¿Existe un enfoque general para convertir una función recursiva en iterativa y viceversa?

En general, una función recursiva funciona almacenando datos en la pila. Cada vez que va un nivel más profundo, agrega datos a la pila. Cuando finaliza el método, los datos se eliminan de la pila nuevamente.

La solución no recursiva sería almacenar datos en una matriz o lista y recorrer la lista. O, más probablemente, una cola. Empujaría sus datos al final de la cola y abriría los datos desde el comienzo de la cola (primero en entrar, primero en salir) y básicamente caminaría por toda la cola hasta que no haya más datos dentro de ella.

Pero además de esto, no existe una solución genérica real para cambiar entre uno y otro. Esto se debe a que puede incluir todo tipo de optimizaciones en la solución no recursiva. (Por ejemplo, una función recursiva también podría necesitar que se pasen algunos datos fijos con cada llamada. Una versión no recursiva simplemente la almacenaría una vez y la volvería a usar.

He respondido, pregunta similar aquí

Respuesta del usuario de Quora a ¿Cómo puedo visualizar / percibir la necesidad de recurrencia (mientras hago una lluvia de ideas para encontrar soluciones a los problemas)?

La única diferencia entre recursión e iteración es la complejidad del espacio y la velocidad. La mayoría de los problemas, que se pueden resolver a través de la recursividad, también se pueden resolver a través de la iteración. Pero si quieres menos líneas de código, entonces la recursión es la mejor. Por ejemplo, encontrar todas las rutas posibles a un nodo desde una raíz en un árbol o gráfico solo se puede hacer a través de la recursividad. Lo mismo se aplica para encontrar todas las permutaciones posibles de cadenas de longitud n de una cadena de longitud m.

lecturA INTERESANTE

¿Cómo encontrar todas las permutaciones posibles de una cadena dada? – http://www.golibrary.co

Sí. No solo se limita a C. Esto funcionará con cualquier idioma. Una forma de convertir una función recursiva en una iterativa es usar una estructura de datos de pila junto con su iteración. Donde llamaría a una función de forma recursiva, inserta el estado en la pila, restablece las variables utilizadas en la iteración a los valores predeterminados y luego continúa con la siguiente iteración. Donde se desenrollaría de la recursividad, saca el estado de la pila, restaurando los valores a las variables utilizadas en la iteración.

Como esta descripción implica, usted usa una estructura de control de bucle, como un bucle for, o un bucle while para hacer su iteración (quizás más de uno).

Para un enfoque general, se necesita una función recursiva si solo solo si

  1. El lenguaje que está codificando no admite bucles while o while como Haskell.
  2. El recuento de iteraciones no se conoce de antemano, de modo que la iteración solo finalizará una vez que se logre un objetivo.

Entonces, para el segundo elemento, otro enfoque perfecto sería usar bucles while en primer lugar.

Básicamente, si el lenguaje en el que está codificando no admite la recursión de memoria como la coincidencia de patrones en los argumentos proporcionados o la optimización de la cola, debe evitar totalmente la recursividad.

More Interesting

¿Son los algoritmos de los programas de computadora, o consisten en algoritmos, o ambos?

Si el AM y el GM entre dos números están en la relación m: n, ¿cuál es la relación de los dos números?

Cada vez que intento resolver un problema en CodeChef o SPOJ, aparece el error de límite de tiempo excedido. ¿Qué tengo que hacer? ¿Me faltan algoritmos?

¿Hay algún proceso o conjunto de preguntas que uno debería hacer al resolver problemas tácticos de ajedrez?

¿Qué es una explicación intuitiva de MapReduce?

¿Cuál es la diferencia entre una 'Tee de expansión mínima' y 'caminos más cortos'?

¿Cuál es la solución a este problema algorítmico que involucra gráficos y estructuras de datos?

¿Cómo clasifica Quora las preguntas? ¿Qué algoritmos usan?

¿Cómo demostramos que el algoritmo de codificación de Huffman es óptimo?

¿Existe un método o algoritmo matemático para expresar la suma de un número y un número multiplicado por un radical como la fórmula (a + b) ^ 3?

¿Qué es la generación procesal y la generación aleatoria? ¿Cuál es la diferencia y cómo se logra cada uno?

¿Qué es un algoritmo eficiente para el agrupamiento k-means donde k es 2 y la dimensión es una, con o sin pesos?

¿Qué es mejor entre la búsqueda binaria y el árbol de búsqueda binaria para buscar?

¿Cuál es el enfoque algorítmico para resolver el problema de hackerrank Substring Diff?

¿La programación se trata de definiciones de variables, para bucles, ifs y estructuras de datos?