Beruflich Dokumente
Kultur Dokumente
07/05/2012
07/05/2012
RECURSIVIDAD
DEFINICIN: La recursividad, es un concepto muy importante en matemticas, pues muchas definiciones se sustentan en la recursividad. Se dice que un objeto es recursivo, cuando en parte esta formado o definido en trminos de s mismo.
07/05/2012
SON EJEMPLOS DE DEFINICIONES RECURSIVAS: 1. LAS ESTRUCTURAS DE RBOL EN COMPUTACION: SEA T UN RBOL
a)
b)
t=0 es un rbol denominado rbol vaco. Si t1 y t2son rboles, entonces las estructuras formadas por un nodo con dos rboles descendientes tambin son un rbol.
t1
t2
07/05/2012
0 (CERO) es un nmero natural El sucesor de un nmero natural es otro nmero natural. 0,1,2,3,4,5,6, . . .
c)
07/05/2012
n>0
El clculo manual para el factorial de 5 se presenta a continuacin y luego el programa que implementa la definicin recursiva para el factorial.
07/05/2012
07/05/2012
#include <iostream> //funcion factorial recursivo using namespace std; float fact(int n); int main() //recur1.cpp { int n; cout<<"Ingrese n : "; cin>>n; cout<<"el factorial de "<<n<<" es: "<<fact(n)<<endl; return 0; } float fact(int n) { if(n==0) return 1; else return n*fact(n-1); }
7
07/05/2012
07/05/2012
return
fib(2)
fib(3)
return fib(1)
fib(0)
return
fib(2)
fib(1)
return 1
return 0
return
fib(1)
fib(0)
return 1
return 1
return 0
07/05/2012
#include <iostream> // funcion fibonacci recursiva float fibo(int n); using namespace std; int main() //recur2.cpp { int n; cout<<"Ingrese n : "; cin>>n; cout<<"El numero de Fibonacci es : "<<fibo(n)<<endl; return 0; } float fibo(int n) { if(n==0 || n==1) return n; else return fibo(n-1)+fibo(n-2); }
10
07/05/2012
11
07/05/2012
El caso Base: Es el caso trivial El caso general: Es el que se acerca al caso base.
Sin duda la utilidad de la recursin radica en la posibilidad de expresar un conjunto infinito de objetos mediante una proposicin finita.
12
07/05/2012
PASOS A SEGUIR PARA DESARROLAR PROBLEMAS DE RECURSIVIDAD Dividir el problema en dos partes. Tener un caso base trivial. Combinar la regla de paro usando if. Verificar que la recursion pueda terminar. Dibujar un rbol de recursion.
1. 2. 3. 4. 5.
13
07/05/2012
si b > 1
La prueba para multiplicar 6 x 4 y el programa que implementa la definicin recursiva para la multiplicacin de dos nmeros enteros viene a continuacin.
14
07/05/2012
07/05/2012
//multiplicacion a*b recursiva #include <iostream> int multrec(int a, int b); using namespace std; int main() { int a, b; cout<<"Ingrese dos enteros "; cin>>a>>b; cout<<"\nEl producto es "<<multrec(a,b)<<endl; return 0; } int multrec(int a, int b) { if (b == 1) return a; else return (a + multrec(a,b-1)); }
16
07/05/2012
1; = X (X
si
n 1
n = 0 si n > 0
);
La prueba manual para elevar 2 a la 4 y el programa que implementa la definicin recursiva para la potencia X a la n, viene a continuacin.
17
07/05/2012
07/05/2012
//funcion potencia x a la n #include <iostream> float potenrec(float x, int n); using namespace std; int main() //recur4.cpp { int x, n; cout<<"Ingrese base y exponente enteros positivos "; cin>>x>>n; cout<<x<<" a la "<<n<<" = "<<potenrec(x,n)<<endl; return 0; } float potenrec(float x, int n) { if (n==0) return 1; else return (x*potenrec(x,n-1)); }
19
07/05/2012
Suma con 1 elemento: suma(a,1) = a[0] Suma con 2 elementos: suma(a,2) = a[0] + a[1] = a[1] + suma(a,1) Suma con 3 elementos: suma(a,3) = a[0]+a[1]+a[2] = a[2] + suma(a,2) ... Suma con n elementos: Suma(a,n) = a[0]+a[1]+a[2]+a[3]+...+a[n-1] = a[n-1] + suma(a,n-1)
20
10
07/05/2012
si n > 1
El programa que implementa la definicin recursiva para la suma de los n, elementos de un array viene a continuacin.
21
07/05/2012
//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]; else return (a[n-1] + sumarec(a,n-1)); }
22
11
07/05/2012
Mximo con 1 elemento: Mximo(a,1) = a[0] Mximo con 2 elementos: Mximo(a,2) = Mximo(a[1], Mximo(a,1)) Mximo con 3 elementos: Mximo(a,3) = Mximo(a[2], Mximo(a,2)) ... Mximo con n elementos: Mximo(a,n) = Mximo(a[n-1], Mximo(a,n-1))
El programa que implementa la funcin recursiva para hallar el mximo valor en una array de n, elementos es
23
07/05/2012
//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++) cin>>x[i]; cout<<"El maximo elemento es: "<<max(n,x)<<endl; return 0; } int max(int n,int x[]) { if(n==1) return x[0]; if(x[n-1]>max(n-1,x)) return x[n-1]; else return max(n-1,x); }
24
12
07/05/2012
25
07/05/2012
CONTINUACIN...
void reversa_frase(int n) { char s[MAX]; if (n>1) { gets(s); reversa_frase(n-1); } else gets(s); puts(s); }
26
13
07/05/2012
27
07/05/2012
14
07/05/2012
CONTINUACIN...
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]); }
29
07/05/2012
30
15
07/05/2012
07/05/2012
CONTINUACIN...
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)); }
32
16
07/05/2012
Supngase que se deposita un monto m para lo cual se recibe i % de inters anual. Se pide determinar mediante la recursividad el capital que se tendr al cabo de n aos. Solucin: Asuma que m = 4000 y un inters i = 10% Co = 4000 //capital inicial C1 = Co + Co*10% //capital al finalizar el 1 ao C2 = C1 + C1*10% //capital al finalizar el 2 ao C2 = C2 + C2*10% //capital al finalizar el 3 ao
33
07/05/2012
34
17
07/05/2012
07/05/2012
SEA N = 4. LA TABLA SIGUIENTE MUESTRA LOS CLCULOS QUE SE VAN SUCEDIENDO EN LAS VARIABLES Y LOS VALORES ALMACENADOS EN LA PILA
Paso 0 1 2 3 4 5 6 7 8 9 n 4 4 3 2 1 0 1 2 3 4 Pila 1.10 1.10,1.10 1.10,1.10,1.10 1.10,1.10,1.10,1.10 1.10,1.10,1.10,1.10 1.10,1.10,1.10 1.10,1.10 1.10 CapitalRec
18
07/05/2012
(a) Secuencia de llamadas recursivas Capital Rec.(4) 1.10*Capital Rec.(3) 1.10*Capital Rec.(2) 1.10*Capital Rec.(1) 1.10*Capital Rec.(0) 4000 (b) Valores devueltos en cada llamada recursiva
5856.4 (Valor final devuelto) Capital Rec.(4) 1.10*5324=5856.4 es devuelto 1.10*Capital Rec.(3) 1.10*4840=5324 es devuelto 1.10*Capital Rec.(2) 1.10*4400=4840 es devuelto 1.10*Capital Rec.(1) 1.10*4000=4400 es devuelto 1.10*Capital Rec.(0) 4000 es devuelto 4000
37
07/05/2012
#include <iostream> #include <stdlib.h> // capital recursivo float 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 aos: "; cin>>n; cout<<"\nIngrese porcentaje o interes anual: "; cin>>i; cout<<"\nEl capital al cabo de "<<n<<" aos es = $"<< CapitalRec(n,m,i); cout<<endl<<endl; return 0; }
38
19
07/05/2012
CONTINUACIN...
39
07/05/2012
REFERENCIAS
1. 2. 3. 4. 5. 6. 7. 8.
Cairo O. Y Guardati S. Estructura de datos 2da. Ed. Editorial McGrawHill. Mxico 2002. Deitel y Deitel, Como programar en C++ 4ta. ed. Editorial Prentice Hall. Mxico, 2003. Langsam; Augenstein; y Tenenbaum, Estructuras de Datos con C++Editorial Prentice Hall, Mxico 1996. Raffo Lecca E. Turbo C 3.0 Raffo Lecca Editores, Lima,1995. Ruiz Lizama Edgar, Programacin con C++ 1ra. ed. Fondo Editorial de la UNMSM., Lima Per, 2009 Ruiz Lizama Edgar, Curso de Lenguaje C 1ra. ed. Facultad de Ingeniera Industrial UNMSM. Lima, 1999. Savitch Walter, Resolucin de problemas con C++ 2da. Ed. Editorial Pearson de Mxico, 2000. Sedgewick Algoritmos en C++ 1ra. Ed. Addison Wesley Iberoamericana U.S.A. 1995.
ERL/2012
40
20