Вы находитесь на странице: 1из 21

Algoritmos recursivos

Programação em Java

Prof. Maurício Braga


Introdução

◼ Alguns tipos de problemas são difíceis de serem


resolvidos quando tentamos solucioná-los da maneira
que se apresentam;

◼ Uma forma de resolver problemas complexos é dividir o


problema em problemas mais simples. Esse processo
de divisão pode prosseguir até que o problema seja
simples o suficiente para ser resolvido;

◼ Uma técnica útil para resolver problemas é a utilização


de funções recursivas.
Recursividade
◼ Processo que envolve a repetição de um objeto de
maneira similar a qual o mesmo já foi mostrado.

◼ Alguns exemplos de recursividade:


 Ex 1: uma pessoa situada entre dois espelhos virados um para o
outro verá várias cópias de sua imagem em cada espelho.
 Ex 2: Na matemática, o conjunto N é definido por:
◼ 0 está em N;
◼ Se x está em N, então x + 1 também está em N.
 Ex 3: Uma sigla cuja definição faz referência a própria sigla.
“GNU = Gnu is Not Unix”. OPO = “O Projeto OPO” (Dilbert)

◼ Em computação o termo se refere a uma técnica de


programação na qual uma função chama a si mesma
durante a realização de uma tarefa.
Exemplo figura recursiva
Características de funções recursivas

◼ Problema vai sendo simplificado a medida que a função


é chamada recursivamente;

◼ Possui uma condição de parada (caso base), que


determina o fim das chamadas recursivas;

◼ Implementação costuma ser feita com a presença de um


teste condicional, que desvia o fluxo para um resultado
conhecido ou para uma chamada recursiva que busca
resolver um sub-problema do problema inicial.
Exemplo

◼ Faça uma função que retorne o fatorial de um número


passado como parâmetro. O fatorial de um número n é
dado por:

 n! = n* (n-1)*(n-2)*(n-3)*...*1
 Ex: 5! = 5 x 4 x 3 x 2 x 1 = 120.

◼ Note que o fatorial de um número também pode ser


escrito como:
 N! = N*(N-1)!
solução sem fazer uso de uma função
recursiva
public static int fatorial (int n) {
int fat =1;
if (n == 0)
return 1;
for (int i=1;i<=n;i++)
fat = fat *i;
return fat;
}
solução usando uma função recursiva

public static int fatorial (int n) {


if (n == 0)
return 1;
else
return n*fatorial(n-1);
}
Análise da função fatorial

◼ Ponto de parada:
 if (n == 0) return 1;

◼ Chamada recursiva, passando um problema


menor para ser resolvido:
 return n*fatorial(n-1);
Fluxo de execução
Questão

◼ Todo problema que faz uso de uma solução


recursiva pode ser resolvido de forma iterativa
(sem recursividade)?
Algoritmos recursivos x iterativos

◼ Sempre é possível criar uma solução iterativa


para um algoritmo recursivo.

◼ Vantagens:
 Simplifica a solução de alguns problemas;
 Maior compactação;
 Melhor legibilidade / facilidade de compreensão;
 Maior facilidade de implementação.
Algoritmos recursivos x iterativos

◼ Desvantagens:
 Gasto de memória;
 Performance inferior;
 Limite máximo de chamadas recursivas (depende da
plataforma computacional utilizada).
Erros mais comuns ao escrever
funções recursivas

◼ Esquecer de definir a condição de parada;

◼ Chamada recursiva não simplifica o problema;

◼ Número excessivo de chamadas recursivas


(mais do que a plataforma consegue suportar),
causando stack overflow (estouro de pilha).
Exercício
◼ Faça uma função que calcule o número de Fibonacci
de um valor inteiro n passado como parâmetro. O
número de Fibonacci é dada por:

◼ Seqüência de Fibonacci:
 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610,
987, 1597, 2584, 4181, 6765, 10946...
Solução usando uma função recursiva

public static int fibonacci(int n) {


if (n < 2)
return n;
else
return fibonacci(n-1) + fibonacci(n-2);
}
Exercício

◼ Faça uma função que calcule de forma recursiva a


potência de um número. Essa função deve receber
como parâmetros o número e o expoente (inteiro) ao
qual ele será elevado.

◼ Ex: potencia(2.0,4) = 16.


Solução

public static double potencia(double x, int n) {


if (n == 0)
return 1;
else
return x * potencia(x, n - 1);
}
Exercício
◼ Faça uma função que calcule
de o enésimo termo da série 1,
3, 6, 10, 15, 21...

◼ PS: Os números dessa série


são chamados números
triangulares porque eles podem
ser visualizados como um
arranjo triangular de objetos.

◼ Ex: numero_triangular(5) = 15.


Solução

public static int triangulo(int n) {


if (n==1)
return 1;
else
return( n + triangulo(n-1) );
}
Algoritmos recursivos

Programação em Java

Prof. Maurício Braga