+ fib(n

Propaganda
Curso de Análise e Desenvolvimento de Sistemas
Estrutura de Dados e Algoritmos II
Aula 01
Introdução
SOCORRAM-ME, SUBI NO ÓNIBUS EM MARROCOS
Definição de Palíndromo
São números ou cadeias de caracteres que podem
ser lidos em ambos os sentidos e representam o
mesmo número ou a mesma palavra.
Exemplos: ana, ata, aaaa, bbbb, “Socorramme, subi no ônibus em Marrocos”, 1190911, 11,
22, 121.
Algoritmo para Palíndromo
ATA
A T A
0 1 2
OBS: Palíndromos podem ter um divisor no meio
como em 11011 ou não como em 1111.
Algoritmo para Palíndromo
Início
car: array de caracteres isPalindromo: boolean
car = ['a',‘n','a']
// É palíndromo até que se prove o contrário
isPalindromo = .v.
// Div 2 ignora o caractere separador do palíndromo
Para i:=0 até car.tamanho div 2 Faça
Se car[i] <> car[car.tamanho - i - 1]
isPalindromo = .f.
Fim Para
Fim Se
Se isPalindromo = .v.
exibir "é palíndromo“
Fim
Senão
Fim Se
exibir "não é palíndromo“
Algoritmo para Palíndromo
Início
car: array de caracteres isPalindromo: boolean
car = ['a',‘n','a']
// É palíndromo até que se prove o contrário
isPalindromo = .v.
// Div 2 ignora o caractere separador do palíndromo
Para i:=0 até car.tamanho div 2 Faça
Se car[i] <> car[car.tamanho - i - 1]
isPalindromo = .f.
Fim Para
Fim Se
Se isPalindromo = .v.
exibir "é palíndromo“
Senão
exibir "não é palíndromo“
Fim Se
Fim
Algoritmo para Palíndromo
Início
car: array de caracteres isPalindromo: boolean
car = ['a',‘n','a']
// É palíndromo até que se prove o contrário
isPalindromo = .v.
// Div 2 ignora o caractere separador do palíndromo
Para i:=0 até car.tamanho div 2 Faça
Se car[i] <> car[car.tamanho - i - 1]
isPalindromo = .f.
Fim Se
Fim Para
Se isPalindromo = .v.
exibir "é palíndromo“
Senão
exibir "não é palíndromo“
Fim Se
Fim
Codificação para Palíndromo
public class Palindromo
{
static char[ ] arr = {‘a',‘n','a'};
public static void main(String[ ] args)
{
boolean isPalindromo = true;
for (int i = 0; i < arr.length / 2; i++)
{
if(arr[i] != arr[arr.length - i - 1])
{
isPalindromo = false;
}
}
if(isPalindromo)
System.out.println("Palavra é palindromo");
else
System.out.println("Palavra não é palindromo");
}
}
Apresentações
Curso
• Unidade 1 – Recursividade
• Unidade 2 – Algoritmos de Ordenação
• Unidade 3 – Árvores
• Unidade 4 – Processamento de Cadeias
• Unidade 5 – Hashing
Apresentações
Bibliografia
1. Estruturas de Dados e Algoritmos – Bruno R. Preiss,
Campus, 2000. Padrões de projetos orientados a objetos
com Java.*
2. Projetos de Algoritmos – Nivio Ziviani,Thomson, 2004.
Com implementações em PASCAL e C.
3. Algoritmos e Estruturas de Dados – Niklaus Wirth, LTC,
1999.
4. Introdução à programação – Anita Lopes e Guto Garcia,
Campus, 2002. 500 Algoritmos resolvidos.
Apresentações
Aula 01
UD 1 – Recursividade
- Conceito
- Definições recursivas
- Exemplos
- Estudo de algoritmos recursivos
- Eficiência da recursividade
- Problemas
- Exercícios sobre recursividade
Recursividade
Recursividade é uma das mais poderosas ferramentas de
programação.
Conceito:
Um objeto é dito recursivo se ele consistir parcialmente
ou for definido em termos de si próprio.
Conceito:
Recursão é um método de programação no qual uma
função pode chamar a si mesma .
Recursividade
A recursão é o processo pelo qual passa um certo procedimento
quando um dos passos do procedimento em questão envolve a
repetição completa deste mesmo procedimento.
Um procedimento que se utiliza da recursão é dito recursivo.
Também é dito recursivo qualquer objeto que seja resultado de
um procedimento recursivo.
Recursividade
Recursividade
O triângulo de Sierpinski
- uma recursão fechada de triângulos formando uma reticulada
geométrica.
Recursividade
• Definição de um algoritmo de maneira
iterativa
X
• Definição de um algoritmo de maneira
recursiva
Fatorial de forma iterativa
Se n = 0
Então Fat(n) = 1
Se n > 0
Então Fat(n) = 1 x 2 x 3 x …N
Fatorial de forma iterativa
int fat(int fatorial){
int i;
int resposta = 1;
if (fatorial == 0)
resposta = 1;
else if (fatorial > 0)
for(i=1;i <= fatorial; i++)
resposta = resposta * i;
return resposta;
}
Fatorial de forma recursiva
Se n = 0
Então Fat(n) = 1
Se n > 0
Então Fat(n) = n x Fat(n – 1)
Fatorial de forma recursiva
Se n = 0
Então Fat(n) = 1
Se n > 0
Então Fat(n) = n x Fat(n – 1)
Fatorial de forma recursiva
int fat_recursivo(int fatorial){
int i;
int resposta = 1;
if (fatorial == 0)
resposta = 1;
else if (fatorial > 0)
for(i=1;i <= fatorial; i++)
resposta = fatorial * fat_recursivo(fatorial-1);
return resposta;
}
Outro exemplo de Recursividade
public class multiplica
{
public static long mult (long A, long B)
{
long res;
if (A == 1) return B;
if (B == 1) return A;
res = mult(A, B-1) + A;
return ( res );
}
public static void main(String[ ] args) {
int num1 = 6, num2 = 3;
System.out.println("Produto de "+ num1 + " por " +
num2 + " = " +multiplica.mult(num1, num2));
}
}
1 1 2 3 5 8 13 21 34 55 ...
Filme de Animação
Fibonacci
Definição Recursiva
se n = 0 ou n = 1 → fib(n) = n
senão fib(n) = fib(n - 2) + fib(n - 1), n >1
fib(1) = 0
fib(2) = 1
fib(3) = fib(2) + fib(1)
fib(4) = fib(3) + fib(2)
Fib(n) = fib(n-1) + fib(n - 2)
Sequência de Fibonacci – Definição
Recursiva
Fibonacci
public class fibonacci
{
public static long fibonacci(long number)
{
long x, y;
if (number <= 1)
{
return number;
}
x = fibonacci (number - 1);
y = fibonacci (number - 2);
return ( x + y );
}
public static void main(String[ ] args)
{
int n = 9;
System.out.println("Fibonacci de "+ n + " = " + fibonacci.fibonacci(n));
}
}
Recursividade
• Recursividade não serve apenas para cálculos
matemáticos;
•Tem uso importante em várias atividades de computação
práticas;
•Muitos algoritmos ficam mais legíveis, quando
construídos utilizando recursividade;
•Vamos utilizar recursividade em uma das atividades mais
conhecidas na computação: a busca
Busca Binária
Busca Binária
• Divide seu vetor em duas metades
• Três condições
1. Se o item for igual ao item que está na metade do
vetor, o item foi encontrado
2. Se for menor, procure na primeira metade
3. Se for maior procure na segunda metade
Animação de Busca Binária
Busca Binária
Busca Binária
Procurar por R
1
2
3
4
5
6
7
8
9
10
A
C
E
H
L
M
P
R
T
Z
X
I
I
X
F
-2 Comparações!
-Pior caso: quando os itens estiverem no início do vetor. Nesse caso, seria melhor utilizar
busca seqüencial. Mas como saber quando o ítem está no início do vetor?
Busca Binária Iterativa
Busca Binária Recursiva
Dicas
• Não se aprende recursividade sem praticar
• Para montar um algoritmo recursivo
– Defina pelo menos um caso básico (condição de
terminação);
– Quebre o problema em problemas menores, definindo o(s)
caso(s) com recursão(ões)
– Fazer o teste de finitude, isto é, certificar-se de que as
sucessivas chamadas recursivas levam obrigatoriamente, e
numa quantidade finita de vezes, ao(s) caso(s) básico(s)
Finalizando
• Recursividade é um tópico fundamental
• Algoritmos recursivos aparecem bastante na
prática
• Dividir e conquistar é uma técnica
naturalmente recursiva para solução de
problemas
• Mais recursividade no nosso futuro,
principalmente na implementação de
árvores...
Exercícios
Desafio I
Qual a saída após a passagem pela função
abaixo, quando n=4?
Desafio II
Qual a saída após a passagem pela função
abaixo?
public class func {
public static void main(String[] args)
{
int res;
res = funcao (4);
System.out.print( res );
}
static int funcao (int n)
{
if (n == 0)
return (0);
return (n + funcao (n-1));
}
}
Desafio III
Download