Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Recursividad
Recursividad
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.
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); }
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); }
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); } }
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