¿Cuáles son las similitudes y diferencias entre recursividad e iteración?

Un método recursivo es un método que se llama a sí mismo directa o indirectamente.
Hay dos requisitos clave para asegurarse de que la recursión sea exitosa:

  • Cada llamada recursiva debe simplificar el cálculo de alguna manera.
  • Debe haber casos especiales para manejar los cálculos más simples.

Iteración vs. Recursividad

  • Si se llama a un método recursivo con un caso base, el método devuelve un resultado. Si se llama a un método con un problema más complejo, el método divide el problema en dos o más piezas conceptuales: una pieza que el método sabe cómo hacer y una versión un poco más pequeña del problema original. Debido a que este nuevo problema se parece al problema original, el método lanza una llamada recursiva para trabajar en el problema más pequeño.
  • Para que la recursión termine, cada vez que el método de recursión se llama a sí mismo con una versión ligeramente más simple del problema original, la secuencia de problemas cada vez más pequeños debe converger en el caso base. Cuando el método reconoce el caso base, el resultado se devuelve a la llamada al método anterior y una secuencia de devoluciones asegura la línea hasta que la llamada original del método finalmente devuelva el resultado final.
  • Tanto la iteración como la recursividad se basan en una estructura de control: la iteración utiliza una estructura de repetición; La recursión utiliza una estructura de selección.
  • Tanto la iteración como la recursión implican repetición: la iteración usa explícitamente una estructura de repetición; La recursión logra la repetición a través de llamadas a métodos repetidos.
  • La iteración y la recursión implican una prueba de terminación: la iteración termina cuando falla la condición de continuación del bucle; La recursión termina cuando se reconoce un caso base.
  • La iteración y la recursión pueden ocurrir infinitamente: un ciclo infinito ocurre con la iteración si la prueba de continuación del ciclo nunca se vuelve falsa; La recursión infinita ocurre si el paso de recursión no reduce el problema de una manera que converge en el caso base.
  • La recursión invoca repetidamente el mecanismo y, en consecuencia, la sobrecarga de las llamadas a métodos. Esto puede ser costoso tanto en tiempo de procesador como en espacio de memoria.

Fuente: http: //www2.hawaii.edu/~tp_200/l…

Descubrí que el límite entre los dos puede ser bastante confuso.

En los lenguajes imperativos, la diferencia es muy obvia, porque si usa una estructura de bucle, está claro que no está usando la recursividad. El programa simplemente se bifurca al final del bloque de bucle, realiza una prueba y luego cambia secuencialmente el estado a algo antes de volver a pasar por el bucle nuevamente. Mientras que, si estás haciendo recursión, claramente no estás usando un bucle, estás llamando a la misma función.

Con la iteración en un lenguaje imperativo, usted sabe que el ciclo se realiza cuando la parte de prueba del ciclo resulta verdadera o falsa (dependiendo de la estructura del ciclo que esté usando). Con la recursividad, hay una prueba dentro de la función, generalmente como la primera instrucción, que comprueba si se ha cumplido una condición final (esto se llama una “condición de arranque”), y si es así, comienza el proceso de desconexión de la recursión.

Las funciones recursivas están estructuradas de tal manera que procesan un poco, hacen una prueba para ver si la función debe repetirse y, por último, hacen un “procesamiento posterior” a medida que la recursividad se desenrolla (cuando la llamada a la función regresa).

En la programación funcional, por ejemplo, es bastante difícil distinguir entre iteración y recursión, porque la naturaleza de FP es que se llama a una función para cambiar de estado. Entonces, desde la perspectiva de un programador imperativo, siempre estás haciendo recursividad. Sin embargo, en FP, la diferencia entre iteración y recursión es que no está dejando el estado atrás antes de realizar una llamada a la función. Si tiene una función esperando en una iteración anterior el resultado que regresa de una llamada a función, entonces está haciendo una recursión. Si no, estás iterando. Parece una distinción sin diferencia. En ambos casos, el ciclo termina cuando se cumple algún estado final y luego desenrolla la recursividad. Supongo que la diferencia con la iteración es que no hay un desenrollamiento real que hacer, ya que no queda ningún estado para procesar mientras se desenrolla.

La pregunta ya ha sido respondida, pero solo pensé en agregar que la mayoría de los algoritmos que se implementan mediante recursión o iteración generalmente se pueden refactorizar para usar el otro método.

Ambos métodos usan repeticiones. Pero la diferencia clave está en Iteration, repetimos la ejecución de un bloque de código / sentencias, mientras que en Recursion repetimos el código de la función llamada (en este caso, la función llamada y las funciones de llamada son los mismos medios, una función que está presente en el bloque de código llamarse una y otra vez).

Las soluciones recursivas no son muy fáciles de pensar y escribir en comparación con el paradigma iterativo …

Aunque necesita algo de práctica para pensar soluciones recursivas