Recursividade.pdf

9
Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Sílvio) pag. 1 Aula 02 - Conteúdo 1) Recursividade 2) Diagramas de Execução 3) Exercícios Recursividade Uma função é dita ser recursiva quando é definida em termos de si mesmo, isto é, uma função recursiva faz a uma chamada a si mesma. Fatorial de um número 0! = 1 1! = 1 2! = 2 . 1! = 2 . 1 = 2 3! = 3 . 2! = 3 . 2 = 6 4! = 4 . 3! = 4 . 6 = 24 5! = 5 . 4! = 5 . 24 = 120 n! = n . (n-1)! Exemplo 2.1 Fatorial (arquivo Ex201.cpp) #include <iostream.h> long int fat(int n) { if ( n < 0 ) return(-1); if ( n == 0 || n == 1 ) return(1); return( n * fat(n-1) ); } void main() { int k; for(k=1; k <= 10; k++) cout << "\nFatorial de " << k << " = " << fat(k); } Seqüência de Fibonacci Essa seqüência tem o nome do matemático italiano que observou que o modelo de criação de coelhos obedece a seqüência abaixo: 1, 1, 2, 3, 5, 8, 13, 21, 34, ... Esta sequência também pode ser observada nas seguintes situações: folhas nos ramos das plantas genealogia do zangão de pétalas de certas flores (margarida, primavera) Exemplo 2.2 Fibonacci (arquivo Ex202.cpp) #include <iostream.h> int Fib(int n) { if ( n <= 2 ) return(1); else return( Fib(n-1) + Fib(n-2) ); } void main() { int k; for(k=1; k <= 20; k++) cout << "\nFibonacci de " << k << " = " << Fib(k);

Transcript of Recursividade.pdf

  • Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 1

    Aula 02 - Contedo

    1) Recursividade 2) Diagramas de Execuo 3) Exerccios

    Recursividade

    Uma funo dita ser recursiva quando definida em termos de si mesmo, isto

    , uma funo recursiva faz a uma chamada a si mesma.

    Fatorial de um nmero 0! = 1

    1! = 1

    2! = 2 . 1! = 2 . 1 = 2

    3! = 3 . 2! = 3 . 2 = 6

    4! = 4 . 3! = 4 . 6 = 24

    5! = 5 . 4! = 5 . 24 = 120

    n! = n . (n-1)!

    Exemplo 2.1 Fatorial (arquivo Ex201.cpp) #include

    long int fat(int n)

    {

    if ( n < 0 ) return(-1);

    if ( n == 0 || n == 1 ) return(1);

    return( n * fat(n-1) );

    }

    void main()

    {

    int k;

    for(k=1; k

  • Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 2

    }

    A funo acima no eficiente pois ocorrem duas chamadas para o mesmo

    nmero. Por exemplo: Fibonacci (6) chama Fibonacci (4) duas vezes. Algumas vezes

    uma funo recursiva pode ser substitudo por uma no recursiva mais eficiente.

    Durante o estgio do projeto, no se deve forar nem impedir a recursividade.

    Na verdade devemos nos concentrar na resoluo do problema de uma maneira clara e

    natural. A preocupao excessiva com eficincia no estgio do projeto pode

    prejudicar os esforos na resoluo do problema.

    Exemplo 2.3 Fibonacci no recursivo (arquivo Ex203.cpp) #include

    int FibNR(int n)

    {

    int i,ant,atual,seg;

    if ( n

  • Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 3

    n de discos n mnimo de movimentos

    1 1

    2 3

    3 7

    4 15

    5 31

    k 2k -1

    Obs: A Torre de Brama implica em 264

    -1 = 18.446.744.073.509.551.615

    movimentos. Se os sacerdotes realizassem um movemento por segundo, 24 horas por

    dia, todos os dias do ano, sem cometer erros, levariam cerca de 6 bilhes de sculos

    para realizar a tarefa (ainda bem ...).

    Exemplo 2.4 Torre de Hanoi (arquivo Ex204.cpp) #include

    void Hanoi(int n,char Orig,char Dest,char Aux)

    {

    if ( n == 1 )

    cout

  • Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 4

    {

    b = b + 1;

    funcA(b);

    }

    cout > x >> y >> z; // x,y,z sao globais

    if (x >= y) P1;

    else P2(x);

    }

    Exemplos de Diagramas de Execuo

    Exemplo 2.7 Escopo de variveis e passagem de parmetros (arquivo Ex207.cpp) #include

    int a,b,c;

    float f;

    void P(int x, int y, int &z)

    {

    z = x + y + z;

    }

    float Q(int &x, int y)

    {

    x += y;

    y = 3;

    return((float) x/7);

    }

    void main()

    {

    a = 5; b = 8; c = 4;

    cout

  • Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 5

    cout

  • Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 6

    lin 2 1 1

    lin 3 1 2 1

    lin 4 1 3 3 1

    lin 5 1 4 6 4 1

    Lin 6 1 5 10 10 5 1

    : : : : : : : ...

    int Pascal(int lin , int col )

    Exemplos:

    Pascal(4,2) retorna 3 (linha 4 e coluna 2 )

    Pascal(6,4) retorna 10 (linha 6 e coluna 4)

    Pascal(9,1) retorna 1 (linha 9 e coluna 1)

    2.04) Desenvolva um algoritmo recursivo em linguagem C para a Funo de

    Ackerman:

    definio da funco de Ackerman:

    a(m.n) = 1 se m = 0

    a(m,n) = a(m-1,1) se m != 0 e n = 0

    a(m,n) = a(m-1,a(m,n-1)) se m != 0 e n != 0

    int Ackerman(int a , int b )

    2.05) Suponha a existncia de um vetor de inteiros

    #define MAX 10;

    int Vet[MAX];

    a) escreva uma funo recursiva para somar o n primeiros elementos de Vet

    int VetSoma(int A[],int n) (n o tamanho do vetor)

    b) escreva uma funo recursiva para encontrar o maior elemento de Vet

    int VetMaior(int A[],int n) ( n o tamanho do vetor)

    c) escreva um procedimento recursivo para inverter Vet. Repare que as

    variveis inic e fim so as posies inicial e final do vetor. void VetInv(int A[],int inic,int fim)

    2.06) Faa o Diagrama de Execuo para o programa abaixo (arquivo

    Ex209.cpp): #include

    int a,b,c;

    void R(int &a, int b, int c)

    {

    a += 8; b += 8; c += 8;

    cout

  • Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 7

    {

    a = 1; b = 1; c = 1;

    cout

  • Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 8

    2.04) Funo de Ackerman: int Ackerman(int m, int n)

    {

    if ( m == 0 ) return(1);

    else

    {

    if ( n == 0 ) return(Ackerman(m-1,1));

    else return(Ackerman(m-1, Ackerman(m,n-1)));

    }

    }

    2.05) Funes recursivas com vetor

    a) Soma dos elmentos de um vetor - VetSoma int VetSoma(int A[], int n)

    {

    if ( n == 1 ) return(A[0])

    else return(A[n-1] + VetSoma(A,n-1));

    }

    b) Maior elemento de um vetor - VetMaior int VetMaior(int A[], int n)

    {

    int aux;

    if ( n == 1 ) return(A[0]);

    else

    {

    aux = VetMaior(A,n-1);

    if ( aux > A[n-1] ) return(aux);

    else return(A[n-1]);

    }

    }

    c) Inverter os elementos de um vetor - VetInv void VetInv(int A[], int inic, int fim)

    {

    int aux;

    if ( inic < fim )

    {

    aux = A[inic];

    A[inic] = A[fim];

    A[fim] = aux;

    VetInv(A,inic+1,fim-1);

    }

    }

    2.06) Diagrama de Execuo

    Resposta:

    Funo R: 17 17 17

    Funo Q: 17 9 9

    Funo P: 17 9 4

    Funo Main: 17 9 4

    2.07) Diagrama de Execuo

    Resposta: 1125 0 512

    2.08) Diagrama de Execuo

  • Estruturas de Dados e Algoritmos (C/C++) Aula 02 (Prof. Slvio) pag. 9

    Caro aluno, este exerccio por sua conta. Divirta-se.

    2.09) Diagrama de Execuo

    Caro aluno, este exerccio por sua conta. Divirta-se.