CB412 I Recursividad

download CB412 I Recursividad

of 20

description

programacion digital uni

Transcript of CB412 I Recursividad

  • 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;

    }