1 07/05/2012 Mg. Edgar Ruiz Lizama 1 UNMSM –FACULTAD DE INGENIERIA INDUSTRIAL ALGORITMOS Y PROGRAMACION RECURSIVIDAD DEFINICIÓN: La recursividad, es un concepto muy importante en matemáticas, pues muchas definiciones se sustentan en la recursividad. Se dice que un objeto es recursivo, cuando en parte esta formado o definido en términos de sí mismo. 07/05/2012 Mg. Edgar Ruiz Lizama 2
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
1
07/05/2012Mg. Edgar Ruiz Lizama
1
UNMSM –FACULTAD DE INGENIERIA INDUSTRIALALGORITMOS Y PROGRAMACION
RECURSIVIDAD
DEFINICIÓN: La recursividad, es unconcepto muy importante en matemáticas,pues muchas definiciones se sustentan enla recursividad. Se dice que un objeto esrecursivo, cuando en parte esta formado odefinido en términos de sí mismo.
07/05/2012Mg. Edgar Ruiz Lizama
2
2
SON EJEMPLOS DE DEFINICIONES RECURSIVAS:
1. LAS ESTRUCTURAS DE ÁRBOL EN COMPUTACION:SEA T UN ÁRBOL
a) t=0 es un árboldenominado árbolvacío.
b) Si t1 y t2son árboles,entonces lasestructuras formadaspor un nodo con dosárboles descendientestambién son un árbol.
07/05/2012Mg. Edgar Ruiz Lizama
3
t
t1
t2
2. LOS NÚMEROS NATURALES
a) 0 (CERO) es un número naturalb) El sucesor de un número natural es otro
número natural.
c) 0,1,2,3,4,5,6, . . .
07/05/2012Mg. Edgar Ruiz Lizama
4
3
3. EL FACTORIAL DE UN ENTERO NONEGATIVO
07/05/2012Mg. Edgar Ruiz Lizama
5
>−=
=0);1(*
0;1)(
nsinFactn
nsinFact
El cálculo manual para el factorial de 5 se presenta acontinuación y luego el programa que implementa ladefinición recursiva para el factorial.
CALCULO PARA EL FACTORIAL DE 5:
5!
5*4!
3*2!
4*3!
2*1!
1*0!
5!
2*1!
3*2!
4*3!
5*4!
1*0!
1 1Caso base
1 es devuelto
1!=1*1=1 es devuelto
2!=2*1=2 es devuelto
3!=3*2=6 es devuelto
4!=4*6=24 es devuelto
5!=5*24=120 es devuelto
120 es el valor final devuelto
( 1 )
( 2 )
( 3 )
( 4 )
( 5 )
( 6 )
(a) Secuencia de llamadas recursivas (b) Valores devueltos en cada llamadarecursiva
a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ n - 2 ] a [ n - 1 ]
. . .
11
LA RELACIÓN DE RECURRENCIA PARA LA SUMARECURSIVA DE UN ARRAY ES:
>−+−=
=1);1,(]1[
1];0[),(
nsinaSumarecna
nsianaSumarec
07/05/2012Mg. Edgar Ruiz Lizama
21
El programa que implementa la definición recursivapara la suma de los n, elementos de un array viene acontinuación.
//sumar recursivamente los elementos de un array#include <iostream>
int sumarec(int a[], int n);using namespace std;int main(){
int a[] = {1,2,3,4,5};int n = 5;
cout<<"Suma de elementos = "<<sumarec(a,n)<<endl;
return 0;}int sumarec(int a[], int n){
if (n == 1)return a[0];
elsereturn (a[n-1] + sumarec(a,n-1));
}
07/05/2012Mg. Edgar Ruiz Lizama
22
12
7. ENCONTRAR EL MÁXIMO VALOR DE UNARREGLO POR RECURSIVIDAD
Máximo con 1 elemento: Máximo(a,1) = a[0]
Máximo con 2 elementos: Máximo(a,2) = Máximo(a[1], Máximo(a,1))
Máximo con 3 elementos: Máximo(a,3) = Máximo(a[2], Máximo(a,2))
. . .
Máximo con n elementos:
Máximo(a,n) = Máximo(a[n-1], Máximo(a,n-1))
07/05/2012Mg. Edgar Ruiz Lizama
23
7 3 5 9 5 1 5 2 5
a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ n - 2 ] a [ n - 1 ]
. . .
El programa que implementa la función recursiva parahallar el máximo valor en una array de n, elementos es
//encuentra recursivamente el maximo elemento de un array#include <iostream>const int MAX=20;int max(int n,int x[]);using namespace std;int main() //recur8.cpp E. Raffo Lecca{
int x[MAX], n;cout<<"Cuantos elementos en el array? ";cin>>n;for (int i=0; i<n; i++)
cout<<"ingrese cadena : ";cin.getline(s,80);cout<<"ingrese caracter a contar : ";ch=getchar();cout<<"cantidad de ocurrencias del caracter "<<ch<<" = "
<<contador(ch,s)<<endl;cout<<endl;return 0;
}
07/05/2012Mg. Edgar Ruiz Lizama
28
15
CONTINUACIÓN...
int contador(char ch, char s[])
{
if (s[0]=='\0')
return 0; //caso base
else
if (ch==s[0]) //posicion actual
return 1+contador(ch,&s[1]); //incrementar en 1
else
return contador(ch,&s[1]);
}
07/05/2012Mg. Edgar Ruiz Lizama
29
EJECUCIÓN DEL PROGRAMA07/05/2012Mg. Edgar Ruiz Lizama
30
16
10. BÚSQUEDA BINARIA RECURSIVA
#include <iostream>
//binsearch : busqueda binaria recursiva
int binsearch(int a[],int x,int der, int izq);
using namespace std;
int main() //recur7.cpp E. Raffo Lecca
{
int der=0,izq=6,x=5;
int a[]={1,2,3,4,5,6,7};
cout<<x<<" esta en la posicion "<<binsearch(a,x,der,izq) << endl;
cout<<endl;
return 0;
}
07/05/2012Mg. Edgar Ruiz Lizama
31
CONTINUACIÓN...
int binsearch(int a[],int x,int der,int izq)
{
int mitad;
if(der>izq)
return -1;
mitad=(der+izq)/2;
return (x==a[mitad]?mitad:x<a[mitad]?
binsearch(a,x,der,mitad-1):
binsearch(a,x,mitad+1,izq));
}
07/05/2012Mg. Edgar Ruiz Lizama
32
17
11. CASO DE UNA INVERSIÓN Y EL CÁLCULORECURSIVO PARA EL CAPITAL Y SU INTERÉS
Supóngase que se deposita un monto m para lo cual serecibe i % de interés anual. Se pide determinar mediante larecursividad el capital que se tendrá al cabo de n años.
Solución:Asuma que m = 4000 y un interés i = 10%
Co = 4000 //capital inicialC1 = Co + Co*10% //capital al finalizar el 1° añoC2 = C1 + C1*10% //capital al finalizar el 2° añoC2 = C2 + C2*10% //capital al finalizar el 3° año
07/05/2012Mg. Edgar Ruiz Lizama
33
(Tomado de la referencia número 1)
EN GENERAL:CN=1.10*CN-1
OBTENIDO APARTIR CN=CN-1+CN-1*10%
De lo anterior puede ahora plantearse la siguienterelación recursiva
07/05/2012Mg. Edgar Ruiz Lizama
34
>−+=
=0si);1(*)1(
0si;)(
nnCapitalreci
nmnCapitalrec
18
ALGORITMO
capitalRec(n,m,i)if n = 0 then
capitalRec = melse
capitalRec = (1+i)*capitalRec(n-1,m,i)end
07/05/2012Mg. Edgar Ruiz Lizama
35
SEA N = 4. LA TABLA SIGUIENTE MUESTRA LOS CÁLCULOSQUE SE VAN SUCEDIENDO EN LAS VARIABLES Y LOSVALORES ALMACENADOS EN LA PILA
CÓDIGO DEL PROGRAMA#include <iostream>#include <stdlib.h>// capital recursivofloat CapitalRec(int n,float m, float x);using namespace std;int main() //capitrec.cpp{
int n;float m, i;cout<<"Ingrese el capital: ";cin>>m;cout<<"\nIngrese el tiempo en años: ";cin>>n;cout<<"\nIngrese porcentaje o interes anual: ";cin>>i;cout<<"\nEl capital al cabo de "<<n<<" años es = $"<<
CapitalRec(n,m,i);cout<<endl<<endl;return 0;
}
07/05/2012Mg. Edgar Ruiz Lizama
38
20
CONTINUACIÓN...
float CapitalRec(int n,float m,float i)
{
if (n==0)
return m;
else
return (1.0+i)*CapitalRec(n-1,m,i);
}
07/05/2012Mg. Edgar Ruiz Lizama
39
REFERENCIAS1. Cairo O. Y Guardati S. “Estructura de datos” 2da. Ed. Editorial
McGrawHill. México 2002.2. Deitel y Deitel, “Como programar en C++” 4ta. ed. Editorial Prentice Hall.
México, 2003.3. Langsam; Augenstein; y Tenenbaum, “Estructuras de Datos con
C++”Editorial Prentice Hall, México 1996.4. Raffo Lecca E. “Turbo C 3.0” Raffo Lecca Editores, Lima,1995.5. Ruiz Lizama Edgar, “Programación con C++” 1ra. ed. Fondo Editorial de
la UNMSM., Lima Perú, 20096. Ruiz Lizama Edgar, “Curso de Lenguaje C” 1ra. ed. Facultad de
Ingeniería Industrial UNMSM. Lima, 1999.7. Savitch Walter, “Resolución de problemas con C++” 2da. Ed. Editorial
Pearson de México, 2000.8. Sedgewick “Algoritmos en C++” 1ra. Ed. Addison Wesley Iberoamericana