Sie sind auf Seite 1von 4

Programas e Definições Recursivas

ideia fundamental da programação recursiva


num programa recursivo uma solução para um problema é definida em termos de
uma solução análoga, embora mais simples, de si própria

Técnicas de Programação Recursiva o poder das definições recursivas


 consiste na possibilidade de definir um conjunto infinito utilizando uma
frase/expressão finita
 consiste na possibilidade de especificar um número arbitrariamente grande
de cálculos através de um programa recursivo, mesmo que este programa
não contenha, explicitamente estruturas de repetição

Técnicas de programação recursiva 1 Técnicas de programação recursiva 2

Exemplos de Funções Recursivas Execução, Definição e Tipos

z factorial de n (≥0) execução de um programa recursivo


A definição da função é repetida sucessivamente até se atingir uma versão do problema
para a qual a solução de cada um dos subproblemas gerados seja conhecida. Utiliza-se
⎧1 se n = 0 então essa solução para sucessivamente calcular a solução de cada um dos subproblemas
fact (n) = ⎨
⎩n × fact (n − 1) se n > 0
gerados e produzir a resposta desejada
definir um programa recursivo
 parte básica (caso terminal / base)
z n (≥0) primeiros números de Fibonacci constitui a versão mais simples do problema para a qual a solução é conhecida
 parte recursiva (caso geral / passo)
o problema é definido em termos de uma versão mais simples de si próprio
⎧1 se n = 0 ,1 tipos de recursividade
fib ( n ) = ⎨
⎩ fib ( n − 1) + fib ( n − 2 ) se n > 1  recursividade própria (directa)
 recursividade mútua (indirecta)

Técnicas de programação recursiva 3 Técnicas de programação recursiva 4


Exemplo - factorial (versão recursiva) Exemplo - factorial (versão iterativa)

/*************************************
* Pré-condição: um inteiro n>=0
/************************************* * Retorna o valor do factorial de n
* Pré-condição: um inteiro n>=0 *************************************/
* Retorna o valor do factorial de n
************************************/ public static long factorialIterativo(int n)
{
long f=1;
public static long factorial(int n)
int i;
{ if (n==0 || n==1)
if (n==0) return f;
return 1; else
else {
return n*factorial(n-1); for(i=1; i<=n; i++)
} f=f*i;
return f;
}
}

Técnicas de programação recursiva 5 Técnicas de programação recursiva 6

Exemplo -Fibonacci (versão recursiva) Exemplo - Pesquisa Binária (versão recursiva)

public static int pesquisaBin(int[] a, int chave,


/********************************************** int inferior, int superior)
* Pré-condição: um inteiro k>=1 { int n;
if (inferior > superior)
* Retorna o valor do k-ésimo número fibonacci
return -1;
**********************************************/
else
{
public static long fibonacci(int k) n = (inferior + superior) / 2;
{ if (a[n] == chave)
if (k==1 || k==2) return n;
return 1; else if (a[n] < chave)
else
return pesquisaBin(a,chave,n+1,superior);
return (fibonacci(k-1)+fibonacci(k-2));
else
}
return pesquisaBin(a,chave,inferior,n-1);
}
}

Técnicas de programação recursiva 7 Técnicas de programação recursiva 8


Exemplo - Puzzle das Torres de Hanoi Exemplo - Puzzle das Torres de Hanoi (resolução geral)

A torre de Hanoi é constituída por 3 postes verticais, nos quais podem ser
colocados discos de diâmetros diferentes furados no centro, variando o
Para resolver o puzzle da torre de Hanoi para n (>1) discos, é necessário
número de discos de puzzle para puzzle. O puzzle é iniciado com todos os
realizar três passos:
discos no poste da esquerda e a finalidade é movimentar todos os discos
para o poste da direita de acordo com as seguintes regras: (1)movimentar n - 1 discos do poste da esquerda para o poste do centro
(utilizado como poste auxiliar);
(1)apenas se pode movimentar um disco de cada vez;
(2)movimentar o disco do poste da esquerda para o poste da direita;
(2)em cada poste, apenas se pode movimentar o disco de cima;
(3)movimentar os n - 1 discos do poste do centro para o poste da direita.
(3)nunca se pode colocar um disco sobre outro disco de diâmetro menor

configuração inicial → configuração final

Técnicas de programação recursiva 9 Técnicas de programação recursiva 10

Exemplo - Puzzle das Torres de Hanoi (implementação


Java) Exemplo - Cálculo do valor aproximado de ex

public class TorresHanoi { class CalculoDeE


{
public static long factorial(int k)
public static void main(String[] args) { {
/* mover 3 discos do pino A para o pino C usando B como temporário*/ if (k == 0)
moverTorre(3, 'A', 'C', 'B'); return 1;
} else
public static void moveUmDisco(char inicio, char fim) return k * factorial(k - 1);
}
{ public static double potencia(double y, int k)
System.out.println(inicio+"\t"+ fim); { if (k == 0)
} return 1;
else
public static void moverTorre(int n, char inicio, char fim, char return x * potencia(y,k-1);
temp) }
public static double soma(double y, int k)
{ {
if(n == 1) if (k == 0)
{ return 1;
moveUmDisco(inicio, fim); else
return ((potencia(y,k) / factorial(k)) + soma(y,k - 1));
} }
else public static void main(String [] args)
{ { double x; int n;
moverTorre(n - 1, inicio, temp, fim); System.out.println(“Introduza o valor de x: “);
moveUmDisco(inicio, fim); x=SavitchIn.readLineDouble();
System.out.println(“Introduza a potência máxima: “);
moverTorre(n - 1, temp, fim, inicio); n=SavitchIn.readLineInt();
} System.out.println(“O valor aproximado é: “+soma(x,n));
} }
} }
Técnicas de programação recursiva 11 Técnicas de programação recursiva 12
Exemplo: O uso da recursividade para o controlo de dados
de entrada em Java
public void getValor()
{ try
{
System.out.println("Introduza um número positivo:");
valor = SavitchIn.readLineInt();
if (valor <= 0)
throw new Exception("O valor deve ser positivo );
}
catch(Exception e)
{
System.out.println(e.getMessage());
System.out.println("Tente de novo.");
getValor(); //recomeça novamente
}
}
O objectivo do método getValor é emitir uma mensagem de erro se o utilizador
introduzir um número inteiro negativo e permitir uma nova oportunidade para reintroduzir
um valor inteiro positivo

Técnicas de programação recursiva 13

Das könnte Ihnen auch gefallen