Está en la página 1de 20

II UNIDAD

FUNCIONES RECURSIVAS
Una función es recursiva cuando
dentro de su bloque de
instrucciones se invoca a sí misma

int prueba (int x)


{
………………………….
…………………………
……………………………..
A= prueba (x-1);
…………………….
………………………….
}
Vamos a comparar una función recursiva con
la artesanía tradicional rusa: La Matrioshka.
La Matrioshka es una muñeca de madera que contiene
otra muñeca más pequeña dentro de sí. Esta muñeca,
también contiene otra muñeca dentro. Y así, una dentro
de otra, hasta una muñeca FINAL que ya no contiene
otra muñeca .
Una función recursiva puede ser:

Recursiva de forma directa :si es llamada a sí misma

int prueba (int x)


{
………………………….
…………………………
……………………………..
A= prueba (x-1);
…………………….
………………………….
}
Una función recursiva puede ser:
Recursiva de forma indirecta:(si llama a una función
que luego la llama).
int control (int x)
{
…………………………
……………………………..
A= prueba (x-1);
…………………….
………………………….
}

int prueba (int x)


{
…………………………
……………………………..
A= control (x);
…………………….
………………………….
}
Cuando se llama a una función, se crea un nuevo
juego de variables locales, de este modo, si la
función hace una llamada a sí misma, se guardan
sus variables y parámetros

La nueva instancia de la función trabajará con su


propia copia de las variables locales, cuando esta
segunda instancia de la función retorna, recupera las
variables y los parámetros anteriores y continúa la
ejecución en el punto en que había sido llamada.
Una función recursiva tiene que estar
especialmente diseñada para que funcione
correctamente, ya que al llamarse a sí
misma provoca que esta se vuelva a
ejecutar, y así sucesivamente, que si no está
controlado se vuelve infinito.

Debería tener un IF que termine con la función.


Un razonamiento recursivo tiene dos partes:

1. Caso base o de fin de la recursión:


Es un caso donde el problema puede resolverse sin
tener que hacer uso de una nueva llamada a sí mismo.

Es el punto de terminación de la función recursiva.


Una función recursiva debe saber resolver el caso más
simple, llamado caso base.

Caso base
Un razonamiento recursivo tiene dos partes:

2. Parte recursiva:

Relaciona el resultado del algoritmo


con resultados de casos más simples.

Se hacen nuevas llamadas a la


función, pero están más próximas al
caso base.
Muñecas rusas Solución recursiva
Al abrir una muñeca grande Al descomponer un problema
encontramos muñecas más grande (casos recursivos)
pequeñas en su interior encontramos subproblemas
que tienen la misma
estructura que el problema
inicial y trabajan sobre datos
más pequeños
La muñeca más pequeña ya Existen casos simples
no contiene otras muñecas cuya solución no requiere
descomponerlos más.
Sólo hay dos tipos de muñecas Entre los casos simples y los
(las que contienen otras en su recursivos tengo todas las
interior y las más pequeñas posibilidades cubiertas
que no las contienen).
Para entender mejor el concepto de función
recursiva expondremos un caso sencillo: cálculo del
factorial de un número.
El cálculo de factorial es posible hacerlo tanto
con una estructura de control como usando una
función recursiva.
Por ejemplo, al llamar a la función de la siguiente forma:
factorial(5), lo que hará es verificar si el número pasado
es el caso base (o sea, si es 0). Si es así, retorna el
resultado, o sea, 1. En el caso de que el número no sea
0, devuelve el resultado de multiplicar ese número por
la llamada a factorial (a sí misma) con número restado
en 1.

Se iniciará la ejecución de la función pero esta vez con el


número 4. Este proceso se repetirá tantas veces como
sea necesario hasta que la variable numero sea el caso
base, o sea 0. Una vez que se llega al caso base,
comienza a calcular el factorial (de atrás hacia adelante).
4!
4 * 3!
3 * 2!
2 * 1!
1 * 0!
1

Caso base: 0!= 1

Parte Recursiva: N * (N – 1) !.
1. long factorial(int N)
2. { if (N == 0)
3. N= 1;
4. else
5. N=N * factorial(N - 1);
6. return N;}
7. int main (void)
8. { int n;
9. cout<<"ingrese numero“;
10. cin>>n;

11. cout<<"su factorial es: "<<factorial(n);


12. cout<<endl<<“gracias”;
13. getch(); }
Se le pide crear una función recursiva que acepte una base real y un exponente entero y
calcule su potencia

Complete el diseño de la función recursiva determinando:


A. La condición para que se active el caso base
B. El caso base
C. Parte recursiva

double potencia (float b, int exp)


{ double resultado;
if (…............................................)
resultado=….....................;
else

resultado=…............................................................;
return resultado; int main (void)
} { int exp;
float b;
cout<<"ingrese base";
cin>>b;
cout<<"ingrese exponente";
cin>>exp;
cout<<"su potencia es: "<<potencia (b, exp);
getch();
}
Crear un programa que lea un rango de números enteros y mostrar los
enteros impares con una función recursiva.

Complete el diseño de la función recursiva


void rimpar (int rango1, int rango2)
{ if (....................................)
{ if (rango1%2==1)
cout<< rango1<<endl;
…………………………………………….;} }

int main()
{ int rango1,rango2;
cout<< "Ingrese rango1: ";
cin>>rango1; cout<< "Ingrese rango2:
"; cin>>rango2; cout<< "NUMEROS
IMPARES: "<<endl;

rimpar (rango1,rango2);
Elabore una función recursiva que acepte como parámetro un número
entero N y calcule la suma de sus cifras

También podría gustarte