7 recursividad c++
Post on 04-Apr-2018
258 Views
Preview:
TRANSCRIPT
-
7/31/2019 7 Recursividad C++
1/40
21/10/2012Mg. Edgar Ruiz Lizama 1
UNMSMFACULTAD DE INGENIERIA INDUSTRIAL
ALGORITMOS Y PROGRAMACION
-
7/31/2019 7 Recursividad C++
2/40
La recursividad, es un conceptomuy importante en matemticas, pues
muchas definiciones se sustentan en larecursividad. Se dice que un objeto es
recursivo, cuando en parte esta formado odefinido en trminos de s mismo.
21/10/2012Mg. Edgar Ruiz Lizama 2
-
7/31/2019 7 Recursividad C++
3/40
a) t=0 es un rboldenominado rbol
vaco.b) Si t1 y t2son rboles,
entonces lasestructuras formadas
por un nodo con dosrbolesdescendientestambin son un rbol.
21/10/2012Mg. Edgar Ruiz Lizama 3
t
t1
t2
-
7/31/2019 7 Recursividad C++
4/40
a) 0 es un nmero naturalb) El sucesor de un nmero natural es otro
nmero natural.
21/10/2012Mg. Edgar Ruiz Lizama 4
-
7/31/2019 7 Recursividad C++
5/40
21/10/2012Mg. Edgar Ruiz Lizama 5
0);1(*
0;1)(
nsinFactn
nsinFact
El clculo manual para el factorial de 5 se presenta a
continuacin y luego el programa que implementa la
definicin recursiva para el factorial.
-
7/31/2019 7 Recursividad C++
6/40
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 llamada
recursiva
21/10/2012Mg. Edgar Ruiz Lizama 6
-
7/31/2019 7 Recursividad C++
7/40
#include //funcion factorial recursivo
using namespace std;float fact(int n);int main() //recur1.cpp{int n;coutn;cout
-
7/31/2019 7 Recursividad C++
8/4021/10/2012Mg. Edgar Ruiz Lizama 8
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55...........
1);2()1(
1o0;)(
nsinFibonFibo
nnsinnFibo
El programa que implementa esta definicin recursiva
viene a continuacin.
-
7/31/2019 7 Recursividad C++
9/40
fib(4)
fib(3)fib(2)
fib(0)
fib(1)fib(2)
fib(1)
return 1
return 1
return 0
return +
+
+
return
return
fib(0)fib(1)
return 1 return 0
+return
21/10/2012Mg. Edgar Ruiz Lizama 9
-
7/31/2019 7 Recursividad C++
10/40
#include // funcion fibonacci recursivafloat fibo(int n);
using namespace std;int main() //recur2.cpp{int n;coutn;
cout
-
7/31/2019 7 Recursividad C++
11/4021/10/2012Mg. Edgar Ruiz Lizama 11
-
7/31/2019 7 Recursividad C++
12/40
1. El caso Base: Es el caso trivial
2. El caso general: Es el que se acerca al
caso base.
21/10/2012Mg. Edgar Ruiz Lizama 12
Sin duda la utilidad de la recursin radica en laposibilidad de expresar un conjunto infinito de
objetos mediante una proposicin finita.
-
7/31/2019 7 Recursividad C++
13/40
1. Dividir el problema en dos partes.2. Tener un caso base trivial.3. Combinar la regla de paro usando if.4. Verificar que la recursion pueda
terminar.5. Dibujar un rbol de recursion.
21/10/2012Mg. Edgar Ruiz Lizama 13
-
7/31/2019 7 Recursividad C++
14/40
21/10/2012Mg. Edgar Ruiz Lizama 14
1);1,(
1;),(
bsibaMultipa
bsiabaMultip
La prueba para multiplicar 6 x 4 y el programa
que implementa la definicin recursiva para lamultiplicacin de dos nmeros enteros viene a
continuacin.
-
7/31/2019 7 Recursividad C++
15/40
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!.
21/10/2012Mg. Edgar Ruiz Lizama 15
-
7/31/2019 7 Recursividad C++
16/40
//multiplicacion a*b recursiva#include
int multrec(int a, int b);using namespace std;int main(){
int a, b;couta>>b;cout
-
7/31/2019 7 Recursividad C++
17/40
21/10/2012Mg. Edgar Ruiz Lizama 17
0);(
0;1
1
nsiXX
nsiX
n
n
La prueba manual para elevar 2 a la 4 y el
programa que implementa la definicinrecursiva para la potenciaXa la n, viene a
continuacin.
-
7/31/2019 7 Recursividad C++
18/40
21/10/2012Mg. Edgar Ruiz Lizama 18
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
-
7/31/2019 7 Recursividad C++
19/40
//funcion potencia x a la n
#include
float potenrec(float x, int n);
using namespace std;int main() //recur4.cpp
{
int x, n;
coutx>>n;
cout
-
7/31/2019 7 Recursividad C++
20/40
21/10/2012Mg. Edgar Ruiz Lizama 20
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)
1 3 5 7 15 21
a[0] a[1] a[2] a[3] a[n-2] a[n-1]
. . .
-
7/31/2019 7 Recursividad C++
21/40
1);1,(]1[
1];0[),(
nsinaSumarecna
nsianaSumarec
21/10/2012Mg. Edgar Ruiz Lizama 21
El programa que implementa la definicin recursivapara la suma de los n, elementos de un array viene a
continuacin.
-
7/31/2019 7 Recursividad C++
22/40
//sumar recursivamente los elementos de un array#include
int sumarec(int a[], int n);
using namespace std;int main(){
int a[] = {1,2,3,4,5};int n = 5;
cout
-
7/31/2019 7 Recursividad C++
23/40
Mximo con 1 elemento: Mximo(a,1) = a[0]
Mximo con2 elementos: Mximo(a,2) = Mximo(a[1], Mximo(a,1))
Mximo con3 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))
21/10/2012Mg. Edgar Ruiz Lizama 23
7 3 5 95 15 25
a[0] a[1] a[2] a[3] a[n-2] a[n-1]
. . .
El programa que implementa la funcin recursiva para
hallar el mximo valor en una array de n, elementos es
-
7/31/2019 7 Recursividad C++
24/40
//encuentra recursivamente el maximo elemento de un array#include const int MAX=20;int max(int n,int x[]);using namespace std;
int main() //recur8.cpp E. Raffo Lecca{int x[MAX], n;coutn;for (int i=0; i>x[i];
cout
-
7/31/2019 7 Recursividad C++
25/40
//imprime una cadena en reversa
#include
#include
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
-
7/31/2019 7 Recursividad C++
26/40
void reversa_frase(int n)
{
char s[MAX];
if (n>1)
{ gets(s);
reversa_frase(n-1);}
else
gets(s);
puts(s);
}
21/10/2012Mg. Edgar Ruiz Lizama 26
-
7/31/2019 7 Recursividad C++
27/40
21/10/2012Mg. Edgar Ruiz Lizama 27
-
7/31/2019 7 Recursividad C++
28/40
//cuenta recursivamente la ocurrencia de un caracter en una cadena#include #include // para getchar()int contador(char ch, char s[]);using namespace std;int main() //recur6.cpp{ char ch, s[80];
cout
-
7/31/2019 7 Recursividad C++
29/40
int contador(char ch, char s[])
{
if (s[0]=='\0')
return 0; //caso base
elseif (ch==s[0]) //posicion actual
return 1+contador(ch,&s[1]); //incrementar en 1
else
return contador(ch,&s[1]);
}
21/10/2012Mg. Edgar Ruiz Lizama 29
-
7/31/2019 7 Recursividad C++
30/40
21/10/2012Mg. Edgar Ruiz Lizama 30
-
7/31/2019 7 Recursividad C++
31/40
#include
//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
-
7/31/2019 7 Recursividad C++
32/40
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
-
7/31/2019 7 Recursividad C++
33/40
Supngase que se deposita un monto mpara lo cualse recibe i% de inters anual. Se pide determinarmediante la recursividad el capital que se tendr alcabo de naos.
Solucin:Asuma que m = 4000 y un inters i = 10%
Co = 4000 //capital inicialC1 = Co + Co*10% //capital al finalizar el 1 aoC2 = C1 + C1*10% //capital al finalizar el 2 aoC2 = C2 + C2*10% //capital al finalizar el 3 ao
21/10/2012Mg. Edgar Ruiz Lizama 33
(Tomado de la referencia nmero 1)
-
7/31/2019 7 Recursividad C++
34/40
De lo anterior puede ahora plantearse la siguiente
relacin recursiva
21/10/2012Mg. Edgar Ruiz Lizama 34
0si);1(*)1(
0si;
)( nnCapitalreci
nm
nCapitalrec
-
7/31/2019 7 Recursividad C++
35/40
capitalRec(n,m,i)
if n = 0 then
capitalRec = melse
capitalRec = (1+i)*capitalRec(n-1,m,i)
21/10/2012Mg. Edgar Ruiz Lizama 35
-
7/31/2019 7 Recursividad C++
36/40
Paso n Pila CapitalRec0 4
1 4 1.10
2 3 1.10,1.103 2 1.10,1.10,1.104 1 1.10,1.10,1.10,1.10
5 0 1.10,1.10,1.10,1.10 40006 1 1.10,1.10,1.10 4400=4000*1.107 2 1.10,1.10 4840=(4400)*1.108 3 1.10 5324=4840*1.10
9 4 5856=5324*1.10
21/10/2012Mg. Edgar Ruiz Lizama 36
-
7/31/2019 7 Recursividad C++
37/40
21/10/2012Mg. Edgar Ruiz Lizama 37
Capital Rec.(4)
1.10*Capital Rec.(3)
1.10*Capital Rec.(2)
1.10*Capital Rec.(1)
1.10*Capital Rec.(0)
4000
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
(a) Secuencia de llamadas
recursivas
(b) Valores
devueltos en cada
llamada recursiva
-
7/31/2019 7 Recursividad C++
38/40
#include #include
// capital recursivofloat CapitalRec(int n,float m, float x);using namespace std;int main() //capitrec.cpp{
int n;float m, i;
coutm;coutn;couti;
cout
-
7/31/2019 7 Recursividad C++
39/40
float CapitalRec(int n,float m,float i)
{
if (n==0)
return m;
else
return (1.0+i)*CapitalRec(n-1,m,i);
}
21/10/2012Mg. Edgar Ruiz Lizama 39
-
7/31/2019 7 Recursividad C++
40/40
ERL/2011
top related