cb412 i recursividad
DESCRIPTION
programacion digital uniTRANSCRIPT
-
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 236
PROGRAMACION DIGITAL
FUNCIONES RECURSIVAS
WILFREDO CUPE ROMN
CICLO 2015-1
UNIVERSIDAD NACIONAL DE INGENIERIA
FACULTAD DE INGENIERIA CIVIL
-
Funcin Recursiva
Una Funcin es recursiva cuando se llama a simisma.Por ejemplo, el factorial de n se puede calcular con una funcin recursiva:
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 237
=
>=
010)1(*)(
n
nnfactnnfact
-
Diagrama Factorial
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 238
fact(n)
Fin
f 1
return f
f fact(n)Escribir
f
n>0
f n*fact(n-1)
Leern
Inicio
Fin
LLAMADO
DEFINICION
LLAMADORECURSIVO
FV
-
Definicin de la funcin fact
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 239
//Funciones Recursivas
int fact(int n){
int f;
if(n>0) f=n*fact(n-1);
else f=1;
return f;
}
RECURSIVAS.H (Archivo de cabecera)
-
Ejercicio
Definir una funcin recursiva que calcule el nmerocombinatorio.
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 240
=
=
=
=
n
mC
nm
m
n
mC
nmn
m
nm
m
nmnmn
mm
nmn
m
n
mC
1)(
)!1(!)!1(
)()!1)((!)!1(
)!(!!
-
La funcin Combi es recursiva:
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 241
=
>
=
nm
nmnmioCombinatornm
m
nmioCombinator1
),1(),(
-
Diagrama Combinatorio
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 242
Combi(m,n)
Fin
f 1
return f
c Combi(m,n)Escribir
c
m>n
f m*Combi(m-1,n)/(m-n)
Leerm, n
Inicio
Fin
LLAMADO
DEFINICION
LLAMADO RECURSIVO
FV
-
Definicin de la funcin Combi
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 243
int Combi(int m,int n){
int f;
if(m>n) f=m*Combi(m-1,n)/(m-n);
else f=1;
return f;
}
RECURSIVAS.H (Archivo de cabecera)
-
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 244
Ejercicio1Calcular en forma recursiva el mximo comn divisor dedos nmeros
PlanteamientoQue parmetros necesita la funcin?
a por valor (int)b por valor (int)
La funcin retorna un valor?Si, retorna el MCD de a y b.tipo int
=
>=
0%0%)%,(),(
babbababmcd
bamcd
-
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 245
Diagrama MCD
mcd(a,b)
Fin
m b
return m
m mcd(a,b)Escribir
m
m mcd(b,a%b)
Leera, b
Inicio
Fin
LLAMADO
DEFINICION
LLAMADORECURSIVO
a%b0FV
FUNCION PRINCIPAL
-
Definicin de la funcin mcdPROGRAMACION DIGITAL - CB412 CICLO 2015-1 246
int mcd(int a,int b){
int m;
if(a%b!=0)
m=mcd(b,a%b);
else
m=b;
return m;
}
RECURSIVAS.H (Archivo de cabecera)
-
EjercicioEscribir una funcin recursiva que muestre en pantallauna pirmide de h filas formadas por las palabras UNIy FIC.Por ejemplo, para h=7, el resultado sera el siguiente:
UNI
UNI FIC
UNI FIC UNI
UNI FIC UNI FIC
UNI FIC UNI FIC UNI
UNI FIC UNI FIC UNI FIC
UNI FIC UNI FIC UNI FIC UNI
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 247
-
Planteamiento
UNI
UNI FIC
UNI FIC UNI
UNI FIC UNI FIC
UNI FIC UNI FIC UNI
UNI FIC UNI FIC UNI FIC
UNI FIC UNI FIC UNI FIC UNI
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 248
hFila i-simaHay i palabras
(h-i)*2
-
Definicin de la funcin UNIFICPROGRAMACION DIGITAL - CB412 CICLO 2015-1 249
void UNIFIC(int h,int i){
int j;
if(i
-
Ejercicios Propuestos1. Generar con una funcin recursiva los nmeros
de la serie de Fibonacci: 1, 1, 2, 3, 5, 8, 13,
2. Calcular con una funcin recursiva el seno de xutilizando la serie de Maclaurin:
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 250
=
++++=
+
..0,)!12()1(...!7!5!3)()12(753
ii
xxxxxxseno
ii
-
EjercicioGenerar los nmeros de la serie de Fibonacci:1, 1, 2, 3, 5, 8, 13, 21, Fibo1=1Fibo2=1Fibo3=Fibo1+Fibo2Fibo4=Fibo2+Fibo3
Fiboi=Fiboi-2+Fiboi-1
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 251
>+
=
212)1()2()(
n
nnFibonFibonFibo
-
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 252
/*Numeros de Fibonacci con Recursividad*/
#include
#include
int Fibo(int n);
int main(){
int n,i,f;
printf("Ingrese n: "); scanf("%d",&n);
for(i=1;i2)
f = Fibo(n-2)+Fibo(n-1); /*Llamado Recursivo*/
else
f = 1;
return f;
}
-
Ejercicio
Calcular con una funcin recursiva el seno de xutilizando la serie de Maclaurin:
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 253
+
+
=
=
++++=
+
)12(*2*)!12(...5*4*63*2*)(
..0,)!12()1(...!7!5!3)(
212232
)12(753
iix
ixxxx
xxxseno
ii
xxxxxxseno
i
ii
Factor
t = termino i
4444 34444 21
44 844 7648476termino i-1
-
La funcin Serie es recursiva:
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 254
>++
=
errort
errorttixSeriettixSerie
0),1,(),,(
410 =error
)1*2(**2* 2
+=
iixtt
-
PROGRAMACION DIGITAL - CB412 CICLO 2015-1 255
/*Serie seno(x) con Recursividad*/
#include
#include
double Serie(float x,int i, double t);
int main(){
int i; float x,t; double s;
printf("Ingrese x: "); scanf("%f",&x);
i=1;
t=x;
s = x + Serie(x,i,t); /*1er Llamado*/
printf("Serie = %.5lf\n",s);
}
double Serie(float x,int i, double t){
double u,s;
t = -t*x*x/(2*i*(2*i+1));
if(fabs(t)>0.0001)
s = t + Serie(x,i + 1,t); /*Llamado Recursivo*/
else
s = t;
return s;
}