Documente Academic
Documente Profesional
Documente Cultură
21/10/2012
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.
21/10/2012
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
21/10/2012
a) b)
21/10/2012
21/10/2012
120 es el valor final devuelto 5! 5! 5!=5*24=120 es devuelto (1) 5*4! 5*4! 4!=4*6=24 es devuelto (2) 4*3! 4*3! 3!=3*2=6 es devuelto (3) 3*2! 3*2! 2!=2*1=2 es devuelto (4) 2*1! 2*1! 1!=1*1=1 es devuelto (5) 1*0! 1*0! 1 es devuelto (6) 1 Caso base 1
21/10/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); }
21/10/2012
fib(4)
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
21/10/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); }
21/10/2012
10
21/10/2012
11
1. 2.
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.
Mg. Edgar Ruiz Lizama 21/10/2012 12
1. 2. 3.
4.
5.
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.
21/10/2012
13
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.
Mg. Edgar Ruiz Lizama 21/10/2012 14
Sea a=6 y b=4 prod(6,4)=6+prod(6,3) prod(6,3)=6+prod(6,2) prod(6,2)=6+prod(6,1) prod(6,1)=6 prod(6,2)=6+6 prod(6,3)=6+12 =6+18 prod(6,4)=24 Rpta!.
Mg. Edgar Ruiz Lizama 21/10/2012 15
//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)); }
Mg. Edgar Ruiz Lizama 21/10/2012 16
si 1; n 1 ); X ( X
n0 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.
Mg. Edgar Ruiz Lizama 21/10/2012 17
potencia (2,4)=2*potencia(2,3)
potencia(2,3)=2*potencia(2,2) potencia(2,2)=2*potencia(2,1) potencia(2,0)=1 =2*2=>4 =2* 4
=2*8
potencia(2,4)=16
Mg. Edgar Ruiz Lizama 21/10/2012 18
21/10/2012
19
a[0] 1
a[1] 3
a[2] 5
a[3] 7 . . .
a[n-2] a[n-1] 15 21
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)
Mg. Edgar Ruiz Lizama 21/10/2012 20
si n 1
El programa que implementa la definicin recursiva para la suma de los n, elementos de un array viene a continuacin.
Mg. Edgar Ruiz Lizama 21/10/2012 21
a[0] 7
a[1] 3
a[2] 5
a[3] 95 . . .
a[n-2] a[n-1] 15 25
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
Mg. Edgar Ruiz Lizama 21/10/2012 23
//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); }
21/10/2012
24
//imprime una cadena en reversa #include <iostream> #include <stdio.h> const int MAX = 80;
void reversa_frase(int n); using namespace std; int main() //reverfra.cpp E. Raffo Lecca { int n=8; // Hola C++ cout<<"Ingrese caracter a caracter con un ENTER cada vez: "; reversa_frase(n); cout<<endl; return 0; }
21/10/2012
25
void reversa_frase(int n) { char s[MAX]; if (n>1) { gets(s); reversa_frase(n-1); } else gets(s); puts(s); }
21/10/2012
26
21/10/2012
27
//cuenta recursivamente la ocurrencia de un caracter en una cadena #include <iostream> #include <stdio.h> // para getchar() int contador(char ch, char s[]); using namespace std; int main() //recur6.cpp { char ch, s[80]; 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; }
21/10/2012
28
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]); }
21/10/2012
29
21/10/2012
30
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; }
21/10/2012
31
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)); }
21/10/2012
32
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.
21/10/2012
34
21/10/2012
35
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
5856.4 (Valor final devuelto) Capital Rec.(4) 1.10*5324=5856.4 es devuelto 1.10*Capital Rec.(3)
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
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
Mg. Edgar Ruiz Lizama 21/10/2012 37
#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; }
21/10/2012
38
21/10/2012
39
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/2011
21/10/2012
40