You are on page 1of 2

TIPOS DE RECURSIVIDAD

Recursividad simple: Aquella en cuya definicin slo aparece una llamada recursiva. Se puede transformar con facilidad en algoritmos iterativos.
Como ejemplos tenemos, Factorial, Potencia, Bsqueda Binaria.

Recursividad mltiple: Se da cuando hay ms de una llamada a s misma dentro del cuerpo de la funcin, resultando ms difcil de hacer de forma iterativa.
Ejemplo, Fibonacci en su forma original, torres de Hanoi, MergeSort, QuickSort
int Fib( int n ) { if(n<=1) return(1); return(Fib(n-1) + Fib(n-2)); }

Recursividad anidada: En algunos de los argumentos de la llamada recursiva hay una nueva llamada a s misma.

La funcin de Ackermann se define por recursividad como sigue:

Nmeros de A(m,n) m\n 0 1 2 3 4 5 6 0 1 2 3 5 13 65533 A(5,1) 1 2 3 5 13 65533 A(4,65533) A(5,A(5,1)) A(4,A(5,1)) A(5,A(6,1)) 2 3 4 7 29 3 4 5 9 61 A(3,265536-3) A(4,A(5,2)) A(5,A(6,2)) 4 5 6 11 125 A(3,A(4,3)) A(4,A(5,3)) A(5,A(6,3)) n n+1 n+2 2n + 3

(n + 3 trminos)

/* ej: Ackerman */ int Ackermann(int m, int n) { if( m == 0 && n == 0) return 1; if( m == 0 ) return n+1; if( n == 0 ) return Ackermann(m-1,1); else return Ackermann(m-1,Ackermann(m,n-1)); }

A(1,2) = 4 Realizar prueba de escritorio

Recursividad Directa: Se produce cuando un mtodo se invoca a s mismo (todos los ejercicios hechos hasta el momento son de recursin directa). Recursividad Indirecta: Se produce cuando un mtodo invoca a otro, y este vuelve a invocar al primero. Tambin se llama recursin indirecta cuando se cumple el caso anterior con ms de 2 mtodos involucrados en el crculo recursivo.

Cuando se disean algoritmos de recursin indirecta es ms importante tener cuidado en los casos base para que no se termine en una recursividad infinita. Ejercicio: Desarrolle un ejercicio que realice las llamadas indicadas en el ejemplo (3 llamadas a m1, 3 a m2 y 3 a m3) En cada mtodo, nicamente se imprime por pantalla Mtodo x.
public class Program { static int contadorM3 = 0; public static void m1() { Console.WriteLine("En m1"); m2(); } public static void m2() { Console.WriteLine("En m2"); m3(); } public static void m3() { Console.WriteLine("En m3"); contadorM3++; if(contadorM3<3) //Caso Base m1(); } public static void Main(String[] args) { m1(); }

You might also like