Anda di halaman 1dari 71

Recursividade

DCC119 - Algoritmos
Nesta Aula

 Definio de recurso

 Uso de recurso

 Primeiro Exemplo: Fatorial

 Exerccios

2
Definio

 Uma funo dita recursiva quando chama a


si prpria, direta ou indiretamente.

 Propsito: expressar sua funcionalidade ou


objetivo de maneira mais clara e concisa.

 Linguagens que permitem uma funo


chamar a si prpria so ditas recursivas
 Linguagens que no permitem so ditas iterativas
ou no recursivas
3
Entendendo recursividade

Suponha que algum no ICE lhe pergunte:


Como chego Rua Oswaldo Cruz?

4
Entendendo recursividade
Como chego Rua Oswaldo Cruz?

Voc poderia responder com conjunto completo de direes


e referncias... mas, se as direes so muito complexas,
ou se voc no est muito certo de como chegar l, poderia
responder:

V at a esquina das ruas Olegrio Maciel e Halfeld e


ento pergunte l: Como chego Rua Oswaldo Cruz?

5
Entendendo recursividade
Como chego Rua Oswaldo Cruz?

Voc poderia responder com conjunto completo de direes


e referncias... mas, se as direes so muito complexas,
ou se voc no est muito certo de como chegar l, poderia
responder:

V at a esquina das ruas Olegrio Maciel e Halfeld e


ento pergunte l: Como chego Rua Oswaldo Cruz?

Este um exemplo de recurso!!!


6
Revendo o problema....

 Seu colega queria direes para um destino

 Para resolver o problema, voc deu um conjunto de


instrues indicando como seu colega poderia alcanar
seu objetivo

 Aps chegar ao destino indicado por voc, seu colega


se depara com nova verso do problema original

Novo problema, idntico em forma ao original, envolve uma


nova localizao de partida mais prxima ao destino final!
7
Exemplo de Algoritmo
recursivo
Clculo do fatorial de um nmero n

Aprendemos que n! = n * n-1 * n-2 * D * 1

8
Exemplo de Algoritmo
recursivo
Implementao iterativa muito simples:

inteiro Fatorial (inteiro n)


{
inteiro Fat, i;
Fat  1;
para (i2; i<=n;i  i+1) faa
{
Fat  Fat * i;
}
retorne Fat;
}

9
Exemplo de Algoritmo
recursivo
Implementao iterativa muito simples:

inteiro Fatorial (inteiro n) int Fatorial (int n)


{ {
inteiro Fat, i; int Fat, i;
Fat  1;
Fat = 1;
para (i2; i<=n;i  i+1) faa
for (i = 2; i <= n; i++)
{
Fat  Fat * i; Fat = Fat * i;
}
retorne Fat;
} return (Fat);
}

10
Exemplo de Algoritmo
recursivo
Tanto a definio matemtica quanto o cdigo
anterior so simples, porm mais elegante definir o
fatorial como:

1, se n = 1
n!
n * (n-1)!, se n > 1

Fatorial de n definido a partir dos fatoriais dos


naturais menores que ele
11
Exemplo de Algoritmo
recursivo
 Significa que para clculo do fatorial de um
determinado nmero h necessidade de que
se recorra aos fatoriais dos nmeros
anteriores.

Por exemplo: Quanto o fatorial de 4?

12
Exemplo de Algoritmo
recursivo
fatorial de 4! 1, se n = 1
n!
n * (n-1)!, se n > 1

4! =

13
Exemplo de Algoritmo
recursivo
fatorial de 4! 1, se n = 1
n!
n * (n-1)!, se n > 1

4! = 4 * 3!

14
Exemplo de Algoritmo
recursivo
fatorial de 4! 1, se n = 1
n!
n * (n-1)!, se n > 1

4! = 4 * 3!
3! =

15
Exemplo de Algoritmo
recursivo
fatorial de 4! 1, se n = 1
n!
n * (n-1)!, se n > 1

4! = 4 * 3!
3! = 3 * 2!

16
Exemplo de Algoritmo
recursivo
fatorial de 4! 1, se n = 1
n!
n * (n-1)!, se n > 1

4! = 4 * 3!
3! = 3 * 2!
2! =

17
Exemplo de Algoritmo
recursivo
fatorial de 4! 1, se n = 1
n!
n * (n-1)!, se n > 1

4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!

18
Exemplo de Algoritmo
recursivo
fatorial de 4! 1, se n = 1
n!
n * (n-1)!, se n > 1

4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! =

19
Exemplo de Algoritmo
recursivo
fatorial de 4! 1, se n = 1
n!
n * (n-1)!, se n > 1

4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1

20
Exemplo de Algoritmo
recursivo
fatorial de 4! 1, se n = 1
n!
n * (n-1)!, se n > 1

4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1! = 2 * 1 = 2
1! = 1

21
Exemplo de Algoritmo
recursivo
fatorial de 4! 1, se n = 1
n!
n * (n-1)!, se n > 1

4! = 4 * 3!
3! = 3 * 2! = 3 * 2 = 6
2! = 2 * 1! = 2 * 1 = 2
1! = 1

22
Exemplo de Algoritmo
recursivo
fatorial de 4! 1, se n = 1
n!
n * (n-1)!, se n > 1

4! = 4 * 3! = 4 * 6 = 24
3! = 3 * 2! = 3 * 2 = 6
2! = 2 * 1! = 2 * 1 = 2
1! = 1

23
Exemplo de Algoritmo
recursivo
fatorial de 4! 1, se n = 1
n!
n * (n-1)!, se n > 1

4! = 4 * 3! = 4 * 6 = 24
3! = 3 * 2! = 3 * 2 = 6
2! = 2 * 1! = 2 * 1 = 2
1! = 1

Portanto, 4! = 24
24
Exemplo de Algoritmo
recursivo
 Condio que define parada da recurso:
chamada base da recurso ou de caso
base

 Todo programa recursivo deve possuir


uma condio de parada !

 Condio que define recurso chamada


passo recursivo.
25
Exemplo de Algoritmo
recursivo

1, se n = 1 Base da recurso
n!

n * (n-1)!, se n > 1 Passo recursivo

26
Exemplo de Algoritmo
recursivo
inteiro FatorialRecursivo (inteiro n)
{
se (n = 1) Base da recurso
{
retorne 1;
}
seno
{
retorne (n * FatorialRecursivo (n 1));
}
}

27
Exemplo de Algoritmo
recursivo
inteiro FatorialRecursivo (inteiro n)
{
se (n = 1)
{
retorne 1;
}
seno
{
retorne (n * FatorialRecursivo (n 1));
}
}

Passo recursivo

28
Exemplo de Algoritmo
recursivo
int FatorialRecursivo (int n)
{
if (n == 1) Base da recurso
return (1);
else
return (n * FatorialRecursivo (n - 1));
}

Passo recursivo
29
Simulando o algoritmo

Mas o que acontece durante a execuo de uma


funo recursiva?

Suponha que funo chamada em algum ponto do


cdigo:

N  FatorialRecursivo (4);

30
Simulando o algoritmo

4
inteiro FatorialRecursivo (inteiro n)
{
se (n = 1)
{
N  FatorialRecursivo (4); retorne 1;
}
seno
{
retorne (n * FatorialRecursivo (n - 1));
}
}
31
Simulando o algoritmo

FatorialRecursivo (4)
inteiro FatorialRecursivo (4)
{
se (4 = 1)
{
retorne 1;
}
seno
{
retorne (4 * FatorialRecursivo (4 - 1));
}
}
32
Simulando o algoritmo

4 3

FatorialRecursivo (3)
inteiro FatorialRecursivo (3)
{
se (3 = 1)
{
retorne 1;
}
seno
{
retorne (3 * FatorialRecursivo (3 - 1));
}
}
33
Simulando o algoritmo

4 3 2

FatorialRecursivo (2)
inteiro FatorialRecursivo (2)
{
se (2 = 1)
{
retorne 1;
}
seno
{
retorne (2 * FatorialRecursivo (2 - 1));
}
}
34
Simulando o algoritmo

4 3 2 1

FatorialRecursivo (1)
inteiro FatorialRecursivo (1)
{
se (1 = 1)
{
retorne 1;
}
seno
{
retorne (n * FatorialRecursivo (n - 1));
}
}
35
Simulando o algoritmo

4 3 2 1
1

FatorialRecursivo (2)
inteiro FatorialRecursivo (2)
{
se (2 = 1)
{
retorne 1;
}
seno
{ // retorne (2 * FatorialRecursivo (2 - 1));
retorne (2 * 1));
}
}
36
Simulando o algoritmo

4 3 2 1
2 1

FatorialRecursivo (3)
inteiro FatorialRecursivo (3)
{
se (3 = 1)
{
retorne 1;
}
seno
{ // retorne (3 * FatorialRecursivo (3 - 1));
retorne (3 * 2));
}
}
37
Simulando o algoritmo

4 3 2 1
6 2 1

FatorialRecursivo (4)
inteiro FatorialRecursivo (4)
{
se (4 = 1)
{
retorne 1;
}
seno
{ // retorne (4 * FatorialRecursivo (4 - 1));
retorne (4 * 6));
}
}
38
Simulando o algoritmo

4 3 2 1
6 2 1

FatorialRecursivo (4)
24
inteiro FatorialRecursivo (4)
{
se (4 = 1)
{
retorne 1;
N  24; }
seno
{ // retorne (4 * FatorialRecursivo (4 - 1));
retorne (4 * 6));
}
}
39
Exerccio

Escreva um cdigo recursivo para calcular o


mximo divisor comum, MDC, de dois nmeros
inteiros positivos N e M da seguinte maneira:

40
Exerccio
int MDC (int n, int m)
{

41
Exerccio
int MDC (int n, int m)
{
if ( (n>=m) && ((n%m)==0) )
return(m);

42
Exerccio
int MDC (int n, int m)
{
if ( (n>=m) && ((n%m)==0) )
return(m);
else
{

}
}

43
Exerccio
int MDC (int n, int m)
{
if ( (n>=m) && ((n%m)==0) )
return(m);
else
{
if (n<m)
return (MDC(m,n));

}
}

44
Exerccio
int MDC (int n, int m)
{
if ( (n>=m) && ((n%m)==0) )
return(m);
else
{
if (n<m)
return (MDC(m,n));
else
return (MDC(m,n%m));
}
}

45
Exerccio
1) Faa um procedimento recursivo que receba dois
valores inteiros a e b e imprima o intervalo
fechado entre eles. Se a for maior que b mostrar
mensagem de erro.

2) Faa o teste de mesa do procedimento abaixo e


informe qual ser a sada do mesmo se a chamada
for faz( 1, 4 ).

faz (inteiro a, inteiro b)


{
se (a <= b)
{
faz ( a + 1, b);
imprime( a );
}
}
46
Exerccio
3) Dada a funo X:

int X (int n, int m)


{
if ((n<=m) || (m==0) || (n==0))
return 1;
return X(n-1,m)+X(n-1,m+1);
}

a) Qual o valor de X(5,3) ?

b) Quantas chamadas sero feitas na avaliao acima?

47
Exerccios

4) Escreva uma funo recursiva para calcular o somatrio


dos N primeiros nmeros inteiros positivos.

5) Escreva uma funo recursiva que recebe como


parmetros um nmero real X e um inteiro N e retorna o
valor de XN. Obs.: N pode ser negativo

6) Escreva uma funo recursiva para determinar o nmero


de dgitos de um nmero N inteiro.

48
Recursividade
DCC120
Laboratrio de Programao
Definio

 Uma funo dita recursiva quando chama a


si prpria, direta ou indiretamente.

 Propsito: expressar sua funcionalidade ou


objetivo de maneira mais clara e concisa.

 Linguagens que permitem uma funo


chamar a si prpria so ditas recursivas
 A linguagem C uma linguagem recursiva.

50
Exemplo de Algoritmo
recursivo
Clculo do valor de 2n para um nmero n:

Aprendemos que 2n = 2 * 2 * 2 * D * 2.

51
Exemplo de Algoritmo
recursivo
Implementao iterativa muito simples:

int Potencia(int n)
{
int Pot, i;
Pot = 1;
for (i = 1; i <= n; i++)
Pot = Pot * 2;
return (Pot);
}

52
Exemplo de Algoritmo
recursivo
Calcular o valor de 2n como sendo 2 * 2n-1:

2, se n = 1
2n
2 * 2n-1, se n > 1

53
Exemplo de Algoritmo
recursivo
 Significa que, para clculo do valor de 2n
para um determinado n, h necessidade de
que se recorra aos clculos anteriores.

Por exemplo: Quanto o 24?

54
Exemplo de Algoritmo
recursivo
24 2, se n = 1
2n
2 * 2n-1, se n > 1

24 =

55
Exemplo de Algoritmo
recursivo
24 2, se n = 1
2n
2 * 2n-1, se n > 1

24 = 2 * 23

56
Exemplo de Algoritmo
recursivo
24 2, se n = 1
2n
2 * 2n-1, se n > 1

2 4 = 2 * 23
23 =

57
Exemplo de Algoritmo
recursivo
24 2, se n = 1
2n
2 * 2n-1, se n > 1

2 4 = 2 * 23
23 = 2 * 22

58
Exemplo de Algoritmo
recursivo
24 2, se n = 1
2n
2 * 2n-1, se n > 1

2 4 = 2 * 23
2 3 = 2 * 22
22 =

59
Exemplo de Algoritmo
recursivo
24 2, se n = 1
2n
2 * 2n-1, se n > 1

2 4 = 2 * 23
2 3 = 2 * 22
22 = 2 * 21

60
Exemplo de Algoritmo
recursivo
24 2, se n = 1
2n
2 * 2n-1, se n > 1

2 4 = 2 * 23
2 3 = 2 * 22
2 2 = 2 * 21
21 =

61
Exemplo de Algoritmo
recursivo
24 2, se n = 1
2n
2 * 2n-1, se n > 1

2 4 = 2 * 23
2 3 = 2 * 22
2 2 = 2 * 21
21 = 2

62
Exemplo de Algoritmo
recursivo
24 2, se n = 1
2n
2 * 2n-1, se n > 1

2 4 = 2 * 23
2 3 = 2 * 22
22 = 2 * 21 = 2 * 2 = 4
21 = 2

63
Exemplo de Algoritmo
recursivo
24 2, se n = 1
2n
2 * 2n-1, se n > 1

2 4 = 2 * 23
23 = 2 * 22 = 2 * 4 = 8
2 2 = 2 * 21 = 2 * 2 = 4
21 = 2

64
Exemplo de Algoritmo
recursivo
24 2, se n = 1
2n
2 * 2n-1, se n > 1

24 = 2 * 23 = 2 * 8 = 16
2 3 = 2 * 22 = 2 * 4 = 8
2 2 = 2 * 21 = 2 * 2 = 4
21 = 2

65
Exemplo de Algoritmo
recursivo
24 2, se n = 1
2n
2 * 2n-1, se n > 1

24 = 2 * 23 = 2 * 8 = 16
2 3 = 2 * 22 = 2 * 4 = 8
2 2 = 2 * 21 = 2 * 2 = 4
21 = 2

Portanto, 24 = 16
66
Exemplo de Algoritmo
recursivo
 Condio que define parada da recurso:
chamada base da recurso ou de caso
base

 Todo programa recursivo deve possuir


uma condio de parada !

 Condio que define recurso chamada


passo recursivo.
67
Exemplo de Algoritmo
recursivo

2, se n = 1 Base da recurso
2n

2 * 2n-1, se n > 1 Passo recursivo

68
Exemplo de Algoritmo
recursivo
int PotenciaRecursivo (int n)
{
if (n == 1) Base da recurso
return (2);
else
return (2 * PotenciaRecursivo (n - 1));
}

Passo recursivo
69
Exerccios
1) Escreva uma funo recursiva para calcular o N-simo
nmero da sequncia de Fibonacci. A sequncia
dada por:

2) Seja S um vetor de inteiros. Descreva funes recursivas para


calcular:
a) o elemento mximo de S;
b) a soma dos elementos de S;
c) mdia aritmtica dos elementos de S.

3) Escreva um procedimento recursivo que imprima na tela os


nmeros mpares de 1 um nmero fornecido pelo usurio.

70
Exerccios
4) Escreva um procedimento recursivo, ImprimeSerie (i, j,
k), que imprime na tela a srie de valores do intervalo
[i,j], com incremento k (i, j e k so inteiros).

5) Escreva uma funo recursiva int SomaSerie (i, j, k), que


devolva a soma da srie de valores do intervalo [i,j], com
incremento k (i, j e k so inteiros).

6) Faa uma funo recursiva que calcule o valor da srie


S descrita a seguir para um valor n > 0 a ser fornecido
como parmetro para a mesma:
S = 1 + 1/2! + 1/3! + ... 1/n!
OBS: A funo fatorial tambm deve ser recursiva.

71