Recursividade

download Recursividade

If you can't read please download the document

description

Recursividade. Prof. Rosana Palazon. Recursividade. É o nome que se dá quando uma função chama a si própria. Existe a recursão direta – quando uma função chama a si mesma diretamente. E a recursão indireta – quando uma função chama outra, e esta, por sua vez chama a primeira. - PowerPoint PPT Presentation

Transcript of Recursividade

  • Recursividade

    Prof. Rosana Palazon

  • Recursividade o nome que se d quando uma funo chama a si prpria.

    Existe a recurso direta quando uma funo chama a si mesma diretamente.E a recurso indireta quando uma funo chama outra, e esta, por sua vez chama a primeira.

  • RecursividadeUma funo pode ser implementada de forma interativa ou recursiva. quase sempre a forma recursiva apresenta uma codificao mais simples (reduzida).Por outro lado, implementaes interativas tendem a ser mais eficientes (performance) que as recursivas.

  • RecursividadeSempre que h uma chamada de funo (recursiva ou no) os parmetros e as variveis locais so empilhadas na pilha de execuo.No caso da funo recursiva, para cada chamada criado um ambiente local prprio. (As variveis locais de chamadas recursivas so independentes entre si, como se fossem provenientes de funes diferentes).

  • RecursividadePara se aplicar a recursividade deve-se pensar na definio recursiva do problema.

    Vejamos o caso do clculo do fatorial de um nmero n:Pela definio recursiva temos:n! = 1, se n=0 ou n*(n-1)!, se n>0

  • Recursividade - fatorialEnto teremos a seguinte funo:/* calculo do fatorial funo recursiva */int fatorial (int n) { if (n==0) return 1; else return n*fatorial(n-1);}

  • Recursividade - PotnciaProblema: Calcular um valor base (b) elevado a uma potncia inteira positiva (p).

    Definio:se p=0 b^p = 1se p=1 b^p = bse p>=2 b^p = b*b^(p-1)

  • Recursividade - Potncia/*calculo da potencia funo recursiva */double potencia (float b, int p) { if (p==0) return 1; else return b*potencia(b, p-1);}

  • Recursividade - MDCProblema: Clculo do mdc entre dois nmeros, usando o algoritmo de Euclides.

    Lembram-se da verso interativa?

  • Verso Interativa do MDCint mdc(int a, int b) { int r; r = a % b; while (r ! = 0){ a = b; b = r; r = a % b; } return b;}

  • Definio do problema do MDC Definio recursiva para o MDC:mdc(a, b) = b se b divide a, ou seja a%b = 0mdc(b, a%b) caso contrrio

  • Soluo recursiva do MDCint mdc_recursiva(int a, int b) { if (a % b == 0) return b; return mdc_recursiva (b, a % b);}

  • Percurso em lista simplesmente ou duplamente encadeada. typedef struct lista { int info; struct lista *ant, *prox;} sendo Lista* p, um ponteiro para o inicio da lista. se p==NULL significa: fim da lista, ou lista vaziacaso contrrio escrever contedo do n da lista

  • Soluo interativa de percurso em lista void mostra_lista (Lista* p) { Lista *aux; for(aux=p; aux!=NULL;aux=aux->prox) { printf (%d\t, aux->info); }

  • Soluo recursiva de percurso em lista void mostra_lista_recursivo1(Lista* p) { if (p==NULL) return; else { //desnecessrio aps return printf (%d\t, p->info); mostra_lista_recursivo(p->prox); }} OU

  • Soluo recursiva de percurso em lista void mostra_lista_recursivo2 (Lista* p) { if (p!=NULL) { printf (%d\t, p->info); mostra_lista_recursivo(p->prox); }}

  • Exerccios:Escreva uma funo recursiva que calcule a soma de todos os nmeros compreendidos entre os valores A e B passados por parmetro.Escreva uma funo recursiva que calcule os juros compostos de um valor. Para isso o programa dever ler um valor inicial, o nmero de meses e a taxa de juros ao ms, e passar estes valores funo como parmetros. Escreva uma funo que faa a procura sequencial de um valor passado por parmetro num vetor tambm passado por parmetro.Escreva uma funo que faa a procura sequencial de um valor passado por parmetro numa lista simplesmente encadeada cujo ponteiro para o valor inicial foi passado por parmetro.Escreva uma verso recursiva do bubble sort.