Está en la página 1de 31

FUNCIONES RECURSIVAS

Las funciones en matematicas son la relacion que existen entre un


conjunto y otro
Para todo valor en un dominio A existe un unico valor en el
contradominio o conjunto B
El grafico muestra una function compuesta ya
que esta conformada por condiciones.
Si x=0 entonces su imagen =0 de lo contrario su
imagen =1
Si f(2) 2 no es igual a 0 por lo tanto f(2)=1
f(0)=?

FUNCIONES RECURSIVAS
Ahora veamos otra funcion un poco mas compleja
Si buscamos la imagen de 0 entonces su
imagen =1
Que pasa con f(6)
Cumple con la regla pero vemos que la
imagen llama nuevamente a la funcion
Busquemos cual es la imagen de f(6)
f(6)=?
F(6)=6*f(5)
Realizar el procedimiento:
El procedimiento ejecutado es un procedimiento recursivo porque recurre a utilizar la misma
funcion para encontrar el valor de la imagen entonces para buscar x yo llamo a la function n veces
y llegamos a un punto donde ya no se llama a la funcion y este el el punto de control para no
volver a llamar a la funcion.

2.1. Definicin
Un mtodo recursivo es un mtodo que se llama as mismo, ya sea
directa o indirectamente, a travs de otro mtodo.
(Deitel, H. M. & Deitel P. J., 2004)
Un mtodo parcialmente definido en trminos de s mismo, ya sea
directa o indirectamente, a travs de otro mtodo.
(Weiss, M. A)

U2. Recursividad.

2.1. Definicin

SI

Caso base

NO
Parte
recursiva

U2. Recursividad.

2.2. Procedimientos Recursivos


TIPOS:

Recursin
Recursin
Recursin
Recursin

simple
mltiple
cruzada o indirecta
anidada

U2. Recursividad.

2.3. Ejemplo de Casos


FACTORIAL
Cmo se calcula el factorial de un nmero?
Ejemplo:
0!, 1!, 2!, 3!, 4!, 5!

U2. Recursividad.

Ejemplo de Casos
Factorial (forma iterativa)

-- Caso Base

factorial = 1;

factorial =1

-- Parte Recursiva
--)

for (int i =n; i >= 1; i

i = n i >=
1
i -SI

factorial *= i;

factorial *= i

U2. Recursividad.

Ejemplo
de Casos
2.3. Ejemplo
de Casos
Factorial (forma recursiva)
int factorial (int n){
if (n <= 1)
return 1;
else
return (n * factorial ( n-1
));
}

n <= 1

NO
return
(n * factorial (n-1))

U2. Recursividad.

SI

return 1

FUNCIONES RECURSIVAS

Ciclo del Factorial


Recursivo
FACT

FACTORIAL (3)
N es 3
FACTORIAL
FACTORIAL (2)

3*

Retorno 6
N es 2
FACTORIAL
FACTORIAL (1)

2*

Retorno 2
N es 1
FACTORIAL
FACTORIAL (0)

1*

Retorno 1
N es 0
FACTORIAL
1
Retorno 1

FUNCIONES RECURSIVAS vs FUNCIONES ESTANDAR

DE FORMA RECURSIVA SE ALMACENA UNA GRAN CANTIDAD DE DATOS


DE MANERA ESTANDAR UTILIZO 2 VARIABLES
EL PROCESO ES MUCHO MAS LENTO EN LA RECURSIVDAD POR LO QUE TENGO QUE ESTAR
GUARDANDO Y SACANDO DE LA PILA Y LLAMANDO A LA FUNCION POR LO QUE:
NO SIEMPRE VA HACER LA MEJOR SOLUCION VAMOS A DECIR QUE ES LA ULTIMA
SOLUCION QUE VAMOS A UTILIZAR

Ejercicio
Encuentre el error en el siguiente mtodo recursivo y explique
cmo corregirlo:
int suma(int n)
{
if (n == 0)
return 0;
else
return n + suma (n);
}

U2. Recursividad.

Recursividad

Definicin
-

Es una Tcnica
que permite que
una funcin se
llame
a
si
misma.

Definition
- Un algoritmo es
recursivo
si
al
estar encapsulado
en una funcin es
llamado desde la
misma funcin por
lo menos 1 vez.

Recursin va ligado a repeticin

1.1 Validez del algoritmo


recursivo

Al menos
2 elementos

Caso Base

Evita
que
el
algoritmo
sea
infinito.
El
problema
puede resolverse
sin tener que
hacer uso una
nueva llamada a
si mismo.

Paso
Recursivo

Relaciona
el
resultado
del
algoritmo en base
a los resultados
de
casos
mas
simples.
Se
hacen
llamadas
a
la
misma
funcin
pero cada vez
mas prximas al
caso base.

Cundo usar recursividad?


ITERATIVO:

Es una tcnica potente de programacin que permite


RECURSIVO:
resolver
problemas
complejos
en forma simple elegante y
Int Factorial (int n )
clara.
{
Int Factorial (int n )
Int
, res = 1;
{
Sin Embargo:
If (n==0) return (1);
For(=1;<=n;++
) solucin
Sera la ultima
a intentar en caso que los
Return
(n*Factorial (n-1));
res = procesos
res*; iterativos no funcionen.
}
return (res);

} El uso de recursividad

nicamente cuando no haya

solucin iterativa.

Si analizamos en el caso factorial

Por Recursividad: Se tiene que almacenar datos y


direcciones en la pila del programa.

Por Iteracin: se almacenan 2 datos nada mas.

Existen algoritmos complejos


mediante mtodos recursivos.

se

codifican

mas

fcil

Estrategias para procesos


Recursivos

Dos estrategias de resolucin de problemas recursivos:


Divide y vencers : Divide el problema de tamao n en problemas ms pequeos cada uno de
los cuales es similar al original pero de menor tamao.
Si se llega a una solucin de los sub-problemas, se podr construir de forma sencilla una solucin al
problema general.
Cada uno de esos sub-problemas se podr resolver de forma directa (caso base) o dividindolos en
problemas ms pequeos mediante la recursividad.

Backtracking = Fuerza Bruta = Vuelta Atras. Divide la solucin en pasos, en cada uno de los
cuales hay una serie de opciones que ha que probar de forma sistemtica. En cada paso se
busca una posibilidad o solucin o solucin aceptable.
Si se encuentra se una solucin valida pasa a decidir el paso siguiente.
Si no se encuentra una solucin aceptable, se retrocede hasta la ltima solucin aceptable
encontrada y se elige una opcin distinta a la anterior. La recursividad se utiliza para poder
retroceder hasta encontrar una solucin aceptable.
Ejemplos: Juegos de tablero, laberintos, etc.

3.1 Definicin de Procesos Recursivos


1.

Cul es la variable de recursin?


Es lo primero que hay que identificar
Indica cuantas veces se repite la accin principal del proceso.

2.

Cul es el dominio de la variable de recursin?


El conjunto de nmeros naturales de 0 a N.

3.

Caso Base Resolver el problema para el primer valor del dominio de la


variable de recursin (Definido en el Paso 2)

4.

Paso Recursivo Si ya existe un proceso que hace lo que se necesita, en


este paso se lo LLAMA disminuyendo o aumentado el numero de
elementos N para que se acerque al CASO BASE. Este paso debe completar
lo que falte.

3.2 Resolucin de Procesos Recursivos

Resolucin de problemas recursivos. Para hallar la solucin


recursiva a un problema podemos hacernos tres preguntas:
1. Cmo se puede definir el problema en trminos de uno o ms ?
Problemas ms pequeos del mismo tipo que el original.
2. Qu instancias del problema harn de caso base?
Conforme el problema se reduce de tamao, se alcanzar el caso base
3. Cmo se usa la solucin del caso base para construir una solucin
Alcanzado el caso base, determinar como ahora lograr la solucin
final.

3.3 Pasos para crear un AR

Escriba un IF

caso Base Donde la funcin no se llama a si misma.


Simple = No se necesita llamada recursiva (no
hay
repeticin) Tal vez deba
almacenar el
resultado en una variable.
Escriba un ELSE
a.

b.

Paso Recursivo Donde la funcin se llama a si misma


Es la prxima entrada/estado

Esta deber aproximarse cada vez mas al caso


base
Asuma que la llamada recursiva funciona:
a. Pregntese que hace el algoritmo?
b.

Pregntese como ayuda en la solucin del

problema ?

3.1.4 Base Para escribir el AR

IF (pregunta por el caso base)


{
//Caso Base
} else {
// Paso Recursivo
}

Prctica (Equipo)
De los siguientes problemas resueltos de forma iterativa,
encontrar su solucin recursiva mediante codificacin:
1. Fibonacci (n-1) + (n-2)
2. Conversin de un nmero decimal a binario (n/2, n%2)
3. Potencia (base, exponente)

U2. Recursividad.

Prctica (Equipo)
Fibonacci

int Fibonacci (int n){


//Casos Base
if (n == 0)
return 0;
else{
if (n == 1)
return 1;
// Paso recursivo
else{
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
}
U2. Recursividad.

Prctica (Equipo)
Conversin Decimal a Binario

void aBinario (int n){


// Paso recursivo
if (n >= 2)
aBinario (n/2);
System.out.print(n%2);
}

U2. Recursividad.

Prctica (Equipo)
Elevar a una potencia

int Potencia (int n, int exp){


//Casos Base
if (exp == 0)
return 1;
else{
if (exp == 1)
return n;
// Paso recursivo
else{
return n * Potencia(n, exp-1);
}
}
}
U2. Recursividad.

Recursividad & Iteracin


RECURSIVIDAD
Llamadas repetidas a los mtodos.
Termina cuando se reconoce un caso
base.
Se aproxima poco a poco a la
terminacin.
Infinita cuando no reduce el problema.
Sobrecarga de llamadas a mtodos.

ITERACIN
Instruccin de repeticin explcita.
Termina cuando falla la condicin.
Repeticin controlada por contador.
Infinita cuando la condicin nunca
se vuelve falsa.

U2. Recursividad.

Ventajas
Menos lneas de cdigo.
Refleja el problema con ms naturalidad.
Produce un programa ms fcil de entender y depurar.

U2. Recursividad.

Desventajas
Tiempo de procesador.
Espacio en memoria, consume memoria adicional.

U2. Recursividad.

CONCLUSIONES

Programacin en C

30

Ejemplos de funciones recursivas en C++:

Construya un programar recursivo para indicar si un numero es par o


#include impar
<iostream>
#include <stdio.h>
using namespace std;
int par(int num);
int impar(int num);
main()
{
int num;
cout<<"Ingrese un numero"<<endl;
cin>>num;
if(par(num))
{
cout<<"es par";
}
else
cout<<"Es impar";
}
int par(int num)
{
if(num==0)
return(1);
else
return impar(num-1);
}
int impar(int num)
{
if(num==0)
return 0;
else
return par(num-1);
Programacin en C
}

31

También podría gustarte