Вы находитесь на странице: 1из 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 simple
Recursin mltiple
Recursin cruzada o indirecta
Recursin 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 n

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){
n
if (n <= 1)
return 1;
else n <= 1
SI
return 1
return (n * factorial ( n-1
)); NO
} return
(n * factorial (n-1))

U2. Recursividad.
FUNCIONES RECURSIVAS
Ciclo del Factorial
Recursivo
FACT FACTORIAL (3)

N es 3
FACTORIAL 3*
FACTORIAL (2)
Retorno 6

N es 2
FACTORIAL 2*
FACTORIAL (1)
Retorno 2

N es 1
FACTORIAL 1*
FACTORIAL (0)
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 Definition
- Es una Tcnica - Un algoritmo es
que permite que recursivo si al
una funcin se estar encapsulado
llame a si en una funcin es
misma. 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 Paso


Evita que el Recursivo
algoritmo sea Relaciona el
infinito. resultado del
El problema algoritmo en base
puede resolverse a los resultados
sin tener que de casos mas
hacer uso una simples.
nueva llamada a Se hacen
si mismo. 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
Int Factorial (int n ) complejos en forma simple elegante y
{ clara.
Int Factorial (int n )
Int , res = 1;
Sin Embargo: {
For(=1;<=n;++
Sera la ultima) solucin
If (n==0) return (1);
a intentar en caso que los
res = procesos Return (n*Factorial (n-1));
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 se codifican mas fcil


mediante mtodos recursivos.
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

a. 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

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 ITERACIN
terminacin. Instruccin de repeticin explcita.
Infinita cuando no reduce el problema. Termina cuando falla la condicin.
Sobrecarga de llamadas a mtodos. 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

Вам также может понравиться