Você está na página 1de 36

Laboratório de Programação

II

Recursividade

Professor Adailton José Alves da Cruz


FACET sala 11
Recursividade
“Para entender a
recursividade primeiro
tem se que entender a
recursividade”
Recursividade

Ao tentar resolver o problema,


encontrei obstáculos dentro de obstáculos.
Por isso, adotei uma solução recursiva.
— aluno S.Y
Recursividade

Problema que têm estrutura recursiva


Cada instância do problema contém uma instância menor do
problema

Objeto
Um objeto é tipo recursivo se ele é definido parcialmente
em termos de si próprio

Função
Uma função recursiva possui no seu corpo uma chamada a
si mesma (direta ou indiretamente).

4
Recursividade

Recursividade é a definição de um objeto em função dele mesmo

Exemplos

fatorial
1 𝑠𝑒 𝑛 = 0
n! =
𝑛∗ 𝑛−1 ! 𝑐𝑐

fibonacci
1 𝑠𝑒 𝑛 = 0
F(n) = 1 𝑠𝑒 𝑛 = 1
F(n−1) + F(n−2) 𝑐𝑐

5
Método para problemas
recursivos
se a instância é pequena, resolva-a diretamente
Base
Senão
1. reduza-a a uma instância menor do problema

2. resolva a instância menor do problema

3. use a resolução da instância menor para construir


uma solução da instância original

Recursivo

6
Função recursiva
Fatorial

Caso base
1 𝑠𝑒 𝑛 = 0
n! =
𝑛∗ 𝑛−1 ! 𝑠𝑒 𝑛 > 0
Recorrência

Função Fibonacci

1 𝑠𝑒 𝑛 = 0 Caso base
F(n) = 1 𝑠𝑒 𝑛 = 1
F(n−1) + F(n−2) 𝑠𝑒 𝑛 > 1

Recorrência
Função em C
int fatorial(int n)
{
if (n == 0) return 1;
else
return fatorial(n-1) * n;
}

Int Fib(int n)
{
if(n <= 1)
return 1;
else
return (Fib(n-1) + Fib(n-2));
}
Atividade
 Implemente uma função recursiva para
computar o valor de 2n
Problema 𝟐𝒏

Int Pot2(int n) {
if (n==0)
return 1;
else
return 2 * Pot2(n-1);
}
Problema 𝒙𝒏

int pot(int b, int e)


{
if (!e)
return 1;
else
return (b*pot(b, e-1));
}
Atividade
Simular a função a seguir para a>b

void X(int a, int b) { // considere a > b


if (b == 0)
return a;
else
return X(b, a % b);
}
MDC – algoritmo de Euclides

void X(int a, int b) { // considere a > b


if (b = 0)
return a;
else
return X(b, a % b);
}
Multiplicação de inteiros

void X(int a, int b) { // considere a > b


if (a = 1)
return b;
else
return X(a-1,b)+b;
}
Soma arranjo
int SV(int *v, int n){
if (n==1)
return v[0];
else
return SV(v,n-1)+v[n-1];
}

15
Soma arranjo – outra maneira
int SV(int *v, int e, int d){
int m;

if (e==d)
return v[e];
else{
m=(e+d)/2;
return SV(v,e,m)+SV(v,m+1,d);
}
}

16
Inverte arranjo
int IV(int *v, int a, int b){
int aux;
if (a<b){
aux=v[a];
v[a]=v[b];
v[b]=aux;
return IV(v,a+1,b-1);
}
}

17
Torre de Hanoi

http://en.wikipedia.org/wiki/Tower_of_Hanoi
Torre de Hanoi

Origem Temporário Destino


19
Torre de Hanoi

Origem Temporário Destino


20
Torre de Hanoi

Origem Temporário Destino


21
Torre de Hanoi

Origem Temporário Destino


22
Torre de Hanoi

Origem Temporário Destino


23
Hanoi

void Hanoi(char a, char b, char c, int n)


{
if(n==1)
printf("Mover disco da torre %c para torre %c\n",a,b);
else Chama Hanoi para mover n-1
{ discos da origem para o
temporário
Hanoi(a,c,b,n-1);
printf("Mover disco da torre %c para torre %c\n",a,b);
Hanoi(c,b,a,n-1);
} Chama Hanoi para mover n-1
discos do temporário para o
destino
}

Move disco da origem


(corrente) para o destino
(corrente)
24
Outros exemplos
Efeito Droste

Uma forma visual de recursão


conhecida como efeito Droste.
http://pt.wikipedia.org/wiki/Recursividade

25
Curva de Koch
http://pt.wikipedia.org/wiki/Curva_de_Koch

26
Curva de Koch
http://pt.wikipedia.org/wiki/Curva_de_Koch

void koch(int n, double tam)


{
if(n==0)
linha(tam);
else{
koch(n-1,tam/3.0);
girar(-60.0);
koch(n-1,tam/3.0);
girar(120.0);
koch(n-1,tam/3.0);
girar(-60.0);
koch(n-1,tam/3.0);
}
27
}
Floco de Neve

http://pt.wikipedia.org/wiki/Recursividade

28
Floco de Neve

http://pt.wikipedia.org/wiki/Recursividade

29
Triângulo de Sierpinski

http://pt.wikipedia.org/wiki/Ficheiro:Sierpinski_triangle_evolution.svg

30
Triângulo de Sierpinski

http://pt.wikipedia.org/wiki/Ficheiro:Sierpinski_triangle_evolution.svg

31
Objeto recursivo
void estrela(int x,int y, int r)
{
if ( r > 0 )
{
estrela(x-r, y+r, r div 2);
estrela(x+r, y+r, r div 2);
estrela(x-r, y-r, r div 2);
estrela(x+r, y-r, r div 2);
box(x, y, r);
}
}

32
régua
int regua(int l,int r,int h)
{
int m;
if ( h > 0 )
{
m = (l + r) / 2;
marca(m, h);
regua(l, m, h – 1);
regua(m, r, h – 1);
}
}
Atividade 01

a) Escreva uma função recursiva para calcular o fatorial.


b) Implemente em C uma função recursiva para o
calculo da seqüência de Fibonacci.

1 se n  1
 Recursividade é
f ( n)  1 se n  2 sempre a
 f (n  1)  f (n  2) se n  2 melhor solução.
 Comente está
afirmação.

34
Atividade 02

Implemente uma função recursiva para efetuar uma busca binária em


um arranjo de tamanho n.

35
Referência
 http://pt.wikipedia.org/wiki/Recursividade

Você também pode gostar