Está en la página 1de 6

Recursividad

Una funcin que se llama a s misma se denomina recursiva

Utilidad
Cuando la solucin de un problema se puede expresar en trminos de la resolucin de un problema de la misma naturaleza, aunque de menor complejidad. Slo tenemos que conocer la solucin no recursiva para algn caso sencillo (denominado caso base) y hacer que la divisin de nuestro problema acabe recurriendo a los casos base que hayamos definido. Como en las demostraciones por induccin, podemos considerar que tenemos resuelto el problema ms simple para resolver el problema ms complejo (sin tener que definir la secuencia exacta de pasos necesarios para resolver el problema).

Funcionamiento
- Se descompone el problema en problemas de menor complejidad (algunos de ellos de la misma naturaleza que el problema original). - Se resuelve el problema para, al menos, un caso base. - Se compone la solucin final a partir de las soluciones parciales que se van obteniendo.

Diseo de algoritmos recursivos


1. Resolucin de problema para los casos base: o Sin emplear recursividad. o Siempre debe existir algn caso base.

2. Solucin para el caso general: o Expresin de forma recursiva. o Pueden incluirse pasos adicionales (para combinar las soluciones parciales).

Siempre se debe avanzar hacia un caso base: Las llamadas recursivas simplifican el problema y, en ltima instancia, los casos base nos sirven para obtener la solucin.

int factorial (int n) { int resultado; if (n==0) // Caso base resultado = 1; else // Caso general resultado = n*factorial(n-1); return (resultado); } int potencia (int base, int exp) { if (exp==0) // Caso base return 1; else // Caso general return base * potencia(base,exp-1); }

Recursividad vs. iteracin


Aspectos que hay que considerar al decidir cmo implementar la solucin a un problema (de forma iterativa o de forma recursiva): - La carga computacional (tiempo de CPU y espacio en memoria) asociada a las llamadas recursivas. - La redundancia (algunas soluciones recursivas resuelven un problema en repetidas ocasiones). - La complejidad de la solucin (en ocasiones, la solucin iterativa es muy difcil de encontrar). - La concisin, legibilidad y elegancia del cdigo resultante de la solucin recursiva del problema.

Ejemplo: Sucesin de Fibonacci

Solucin recursiva int fibonacci (int n) { if ((n == 0) || (n == 1)) return 1; else return fibonacci(n-1) + fibonacci(n-2); }

Solucin iterativa int fibonacci (int n) { int actual, ant1, ant2; ant1 = ant2 = 1; if ((n == 0) || (n == 1)) { actual = 1; } else for (i=2; i<=n; i++) { actual = ant1 + ant2; ant2 = ant1; ant1 = actual; } } return (actual); }

Clculo recursivo de fibonacci(5)

Ejemplo: Las torres de Hanoi

Mover n discos del poste 1 al poste 3 (utilizando el poste 2 como auxiliar): hanoi (n, 1, 2, 3);

Solucin recursiva: void hanoi (int n, int inic, int tmp, int final) { if (n > 0) { // Mover n-1 discos de "inic" a "tmp". // El temporal es "final". hanoi (n-1, inic, final, tmp); // Mover el que queda en "inic" a "final" printf (Del poste %d al %d.\n, inic, final); // Mover n-1 discos de "tmp" a "final". // El temporal es "inic". hanoi (n-1, tmp, inic, final); } }

Solucin para 3 discos

Segn la leyenda, los monjes de un templo tenan que mover una pila de 64 discos sagrados de un sitio a otro. Slo podan mover un disco al da y, en el templo, slo haba otro sitio en el que podan dejarlos, siempre ordenados de forma que los mayores quedasen en la base. El da en que los monjes realizasen el ltimo movimiento, el final del mundo habra llegado

También podría gustarte