Sunteți pe pagina 1din 27

Recursividade

Um objeto dito recursivo se ele consistir parcialmente ou for definido em termos de si prprio. Nesse contexto, um tipo especial de procedimento (algoritmo) ser utilizado, algumas vezes, para a soluo de alguns problemas. Esse procedimento denominado recursivo. Todo procedimento, recursivo ou no, deve possuir pelo menos uma chamada proveniente de um local exterior a ele. Essa chamada denominada externa. Um procedimento no recursivo , pois, aquele em que todas as chamadas so externas.

Recursividade
Um programa recursivo um programa que chama a si mesmo, direta ou indiretamente Conceito poderoso
Define conjuntos infinitos com comandos finitos

Vantagens

Reduo do tamanho do cdigo fonte Permite descrever algoritmos de forma mais clara e concisa Reduo do desempenho de execuo devido ao tempo para gerenciamento de chamadas Dificuldades na depurao de programas recursivos, especialmente se a recurso for muito profunda

Desvantagens

Recursividade
Cada vez que uma funo chamada de forma recursiva, alojado e guardado uma cpia dos seus parmetros por forma a no perder os valores dos parmetros das chamadas anteriores. Em cada instncia da funo, s so diretamente acessveis os parmetros criados para esta instncia, no sendo directamente acessveis os parmetros de outras instncias.

Funo Recursiva
A informao guardada na invocao de uma funo designada por Estrutura de Invocao e consiste basicamente na seguinte informao: Endereo de retorno (quando a funo terminar o programa deve continuar a sua execuo na linha seguinte invocao da funo); Variveis passadas como argumentos para a funo (por valor, referncia, etc.); Estado dos registos e flags do CPU; Varivel de retorno (por valor, referncia, etc.);

Funo Recursiva
A estrutura de uma funo recursiva igual estrutura de uma funo no recursiva, na qual necessrio guardar uma informao, sendo esta informao retornada depois do fim da execuo da funo e o valor retornado sempre recuperado e atualizado.

CARACTERSTICAS DAS FUNES RECURSIVAS


As funes recursivas contm duas partes fundamentais: 1. Ponto de Parada: o ponto de parada da recursividade resolvido sem utilizao de recursividade, sendo este ponto geralmente um limite superior ou inferior da regra geral. 2. Regra Geral: o mtodo geral da recursividade reduz a resoluo do problema atravs da invocao recursiva de casos mais pequenos, sendo estes casos mais pequenos resolvidos atravs da resoluo de casos ainda mais pequenos, e assim sucessivamente, at atingir o ponto de parada que finaliza o mtodo.

EXEMPLO DE RECURSIVIDADE

O tringulo de Sierpinski uma recurso fechada de tringulos formando uma reticulada geomtrica.

TEOREMA DA RECURSO
Na teoria dos conjuntos, este um teorema que garante que uma funo definida recursivamente ir existir. Dado um conjunto X, um elemento a de X e uma funo f: X X, o teorema indica que h uma nica funo F: N0 X (onde N0 denota o conjunto dos nmeros naturais) tal que: F(0) = a F(n + 1) = f(F(n)) para qualquer nmero natural n.

Exemplo O Fatorial de n seria dado pela expresso: Ponto de Parada


fatorial n =

fatorial 0 1 fatorial n n * fatorial n1

Regra Geral

Exemplo Como fica o Fatorial de 5? Ponto de Parada


fatorial 1 1 * fatorial 0 = 11=1 fatorial 2 2 * fatorial 1 = 211=2 fatorial 3 3 * fatorial 2 = 3211=6 fatorial 4 4 * fatorial 3 = 43211=24 fatorial 5 5 * fatorial 4 =543211=120

Regra Geral

O que preciso para fazer uma recursividade? 1) Obter uma soluo de como o problema pode ser dividido em passos menores; 2) Definir um ponto de parada; 3) Definir uma regra geral; 4) Verificar se o algoritmo tem fim; 5) Desenhar uma rvore de execuo do programa, mostrando o desenvolvimento do processo.

Utilizar recursividade ou no? Na fase de concepo, os mtodos recursivos so um bom processo flexvel de pensamento; Na fase de implementao, necessrio avaliar os diversos mtodos e questionar qual o melhor mtodo para as circunstncias especificas (mais eficaz e eficiente). CONCLUSO: A recursividade deve ser utilizada quando a forma recursiva a forma mais simples e intuitiva de implementar uma soluo para a resoluo do problema.

FUNO RECURSIVA EM C Mtodo Iterativo Mtodo Recursivo

long int fatorial(int num) { long int result = 1; for(int i = 1; i <= num; i++) result *= i; return(result); }

long int fatorial(int num ) { if (num == 0) { return(1); } else { return( num * fatorial(num 1) ); } }

Exerccio
O problema da Torre de Hani consiste de trs pinos, A, B e C, denominados origem, destino e trabalho, respectivamente, e n discos de dimetros diferentes. Inicialmente, todos os discos se encontram empilhados no pino origem, em ordem decrescente de tamanho, de baixo para cima. O objetivo empilhar todos os discos no pino destino, atendendo s seguintes restries: I. apenas um disco pode ser removido de cada vez; II. qualquer disco no pode ser jamais colocado sobre outro de tamanho menor.

Exerccio
1) Faa um programa recursivo que: Inverta uma string; Converter nmeros inteiros em strings; Clcule o resto da diviso de dois nmeros; Clculo da seguinte formula:
n

ii
i=1

Exerccio
2) Critique a seguinte funo recursiva; ela promete encontrar o valor de um elemento mximo de v[0..n-1]. int maximo_rA (int n, int v[]) { int x; if (n == 1) return v[0]; if (n == 2) { if (v[0] < v[1]) return v[1]; else return v[0]; } x = maximo_rA (n-1, v); if (x < v[n-1]) return v[n-1]; else return x; }

Exerccio
3) Critique a seguinte funo recursiva; ela promete encontrar o valor de um elemento mximo de v[0..n-1]. int maximo_rB (int n, int v[]) { if (n == 1) return v[0]; if (maximo_rB (n-1, v) < v[n-1]) return v[n-1]; else return maximo_rB (n-1, v); }

Exerccio
4) Fibonacci. A funo de Fibonacci definida assim: F (0) = 0, F (1) = 1 e F (n) = F(n-1) + F(n-2) para n > 1. Descreva a funo F em linguagem C. Faa uma verso iterativa e uma recursiva. 5) Exponenciao. Escreva uma funo recursiva eficiente que receba inteiros positivos k e n e calcule kn. (Suponha que kn cabe em um int.) Quantas multiplicaes sua funo executa aproximadamente?

Exerccio
6) Euclides. A seguinte funo calcula o maior divisor comum dos inteiros positivos m e n. Escreva uma funo recursiva equivalente. int Euclides (int m, int n) { int r; do { r = m % n; m = n; n = r; } while (r != 0); return m; }

Exerccio
7) Qual o valor de X (4)? int X (int n) { if (n == 1 || n == 2) return n; else return X (n-1) + n * X (n-2); } 8) Qual o valor de f (1,10)? Escreva uma funo equivalente que seja mais simples. double f (double x, double y) { if (x >= y) return (x + y)/2; else return f (f (x+2, y-1), f (x+1, y-2)); }

Exerccio
9) Qual o resultado da execuo do programa abaixo? int ff (int n) { if (n == 1) return 1; if (n % 2 == 0) return ff (n/2); return ff ((n-1)/2) + ff ((n+1)/2); } int main (void) { printf ("%d", ff (7)); return EXIT_SUCCESS; }

Exerccio
10) Execute fusc (7,0). int fusc (int n, int profund) { int i; for (i = 0; i < profund; i++) printf (" "); printf ("fusc (%d,%d)\n", n, profund); if (n = 1) return 1; if (n % 2 == 0) return fusc (n/2, profund+1); return fusc ((n-1)/2, profund+1) + fusc ((n+1)/2, profund+1); }

Exerccio
11) Critique a seguinte funo recursiva: int XX (int n) { if (n == 0) return 0; else return XX (n/3+1) + n; } 12) Escreva uma funo recursiva que calcule a soma dos elementos positivos do vetor v[ini..fim1]. O problema faz sentido quando ini igual a fim? Quanto deve valer a soma nesse caso?

Exerccio
13) Escreva uma funo recursiva que calcule a soma dos dgitos de um inteiro positivo n. A soma dos dgitos de 132, por exemplo, 6.

14) Escreva uma funo recursiva que calcule o piso do logaritmo de N na base 2.

Exerccio
15) A funo de Ackermann definida para valores inteiros e no negativos de m e n da seguinte forma:
n+1 se m= 0 A m,n = A m 1,1 se m> 0 e n=0 A m1, A m,n1 se m> 0 e n>0

Exerccio
16) Encontrar o mximo divisor comum entre dois nmeros de modo que:
y se y x e x mod y =0 mdc x,y = mdc y,x se y<x mdc y,x mod y caso contrrio

Exerccio
17) Faa uma funo recursiva, em linguagem C, que calcule o valor da srie S descrita a seguir para um valor n>0 a ser fornecido como parmetro para a mesma.
5 10 1 +n s=2 2 3 n
2

S-ar putea să vă placă și