2 Recursión
2 Recursión
2 Recursión
Recursión
La recursión sigue la regla “divide y conquista”, donde rompemos el problema en
pequeños pedacitos que representan el mismo tipo de problema.Lo que estamos
haciendo es simplemente reducir la cantidad de información que debemos procesar,
ya que el problema es resuelto de la misma manera. Desglosamos en una versión
más simple del problema.
Ej: una cuenta matemática:
Una función recursiva está definida en términos de caso base y casos recursivos
● 1. C aso(s) Base: Esta parte no se llama a sí misma. Maneja un caso simple
que sabemos resolver sin tener que desarmar el problema en partes más
chicas. Tiene dos componentes :
->Qué condición es la que hace que la entrada se vuelva más pequeña
->Solución trivial: Si estamos en ella, entonces qué valor debería devolver
Ejemplo : 0! = 1
● 2. Caso(s) Recursivo: Un caso recursivo es cuando la función se invoca a sí
misma y con diferentes parámetros. Tiene 3 componentes:
->Divide el problema en uno más simple o en pequeñas subpartes
->Invoca a la función con cada parte.
->Combina las soluciones de cada una de ellas en una general para el
problema.
Ejemplo: 4! = 4*3!.
Consideremos escribir una función que calcule el factorial de un número. Podemos
definir el factorial de 2 maneras diferentes:
Iterativa Recursiva
if (condición)
Caso recurrente;
Sentencias;
void Cuenta(int n)
{
if (n > 0)
{
printf(“%d ”,n);
Cuenta(n-1);
}
}
void Main()
{
printf(“%d”,Cuenta(2)); ///
}
En Pantalla:
2 1
Si invertimos el orden de las sentencias:
Cuenta(int n) En Pantalla:
{
if (n > 0)
{ 1 2
Cuenta(n-1);
printf(“%d”,n);
}
}
Ejemplos con estructuras de datos:
Comportamiento:
● En cada llamada se analiza un elemento arreglo[i], empezando desde el último y
avanzando hacia la izquierda mediante una llamada recursiva. La búsqueda termina
si el valor X es encontrado o todos los elementos del arreglo fueron examinados, y
por lo tanto no se encontró.
● N es el subíndice de cada celda que se analiza en cada llamada. En la primera, será
la posición del último (Nuestro Tamaño TAM_ARREGLO-1 ó validos-1.
{
if (N >=0)
{
if (arreglo[N] == X)
return 1;
else
{
return Busca(arreglo,N-1,X);
}
}
else
{
return 0;
}
}
void main()
{
int arreglo[5] = {1, 2 , 4, 5 ,6};
int validos=5;
int enc = busca(arreglo,validos-1,4);
}
{
if (N >=0)
{
return (arreglo[N] == X) || Busca(arreglo,N-1,X);
}
else
{
return 0;
}
}
2) Obtener la suma de los elementos de un arreglo de N elementos.
Recursividad indirecta
La Recursión indirecta existe cuando una función P llama a otra función Q, y ésta,
en algún momento, llama nuevamente a P.
Ejemplo:
→ se llama a par() desde el main
int impar(int n)
{
return (n == 1) ? 1 : par(n-1);
}
int par(int n)
{
return (n == 0) ? 1 : impar(n-1);
}
Reglas de la buena recursión