curso de análise e desenvolvimento de sistemas estrutura de dados e algoritmos ii aula 01

39
Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II Aula 01

Upload: shay

Post on 16-Mar-2016

29 views

Category:

Documents


0 download

DESCRIPTION

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. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Curso de Análise e Desenvolvimento de Sistemas

Estrutura de Dados e Algoritmos II

Aula 01

Page 2: 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

Page 3: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

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, “Socorram-me, subi no ônibus em Marrocos”, 1190911, 11, 22, 121.

Page 4: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Algoritmo para Palíndromo

ATA

A T A

OBS: Palíndromos podem ter um divisor no meio como em 11011 ou não como em 1111.

0 1 2

Page 5: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Algoritmo para PalíndromoIníciocar: array de caracteres isPalindromo: booleancar = ['a',‘n','a']// É palíndromo até que se prove o contrárioisPalindromo = .v.// Div 2 ignora o caractere separador do palíndromoPara i:=0 até car.tamanho div 2 FaçaSe car[i] <> car[car.tamanho - i - 1]isPalindromo = .f.Fim ParaFim SeSe isPalindromo = .v.exibir "é palíndromo“FimSenãoFim Seexibir "não é palíndromo“

Page 6: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Algoritmo para PalíndromoIní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 SeFim

Page 7: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Algoritmo para PalíndromoIní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 SeFim

Page 8: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Codificação para Palíndromopublic 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"); }}

Page 9: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Apresentações

Curso

• Unidade 1 – Recursividade

• Unidade 2 – Algoritmos de Ordenação

• Unidade 3 – Árvores

• Unidade 4 – Processamento de Cadeias

• Unidade 5 – Hashing

Page 10: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

ApresentaçõesBibliografia 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.

Page 11: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

ApresentaçõesAula 01 UD 1 – Recursividade- Conceito- Definições recursivas- Exemplos- Estudo de algoritmos recursivos- Eficiência da recursividade- Problemas- Exercícios sobre recursividade

Page 12: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

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 .

Page 13: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

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.

Page 14: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Recursividade

Page 15: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Recursividade

O triângulo de Sierpinski - uma recursão fechada de triângulos formando uma reticulada geométrica.

Page 16: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Recursividade

• Definição de um algoritmo de maneira iterativa

X

• Definição de um algoritmo de maneira recursiva

Page 17: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Fatorial de forma iterativa

Se n = 0Então Fat(n) = 1

Se n > 0 Então Fat(n) = 1 x 2 x 3 x …N

Page 18: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

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;

}

Page 19: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Fatorial de forma recursiva

Se n = 0Então Fat(n) = 1

Se n > 0 Então Fat(n) = n x Fat(n – 1)

Page 20: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Fatorial de forma recursiva

Se n = 0Então Fat(n) = 1

Se n > 0 Então Fat(n) = n x Fat(n – 1)

Page 21: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Fatorial de forma recursivaint 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;

}

Page 22: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Outro exemplo de Recursividadepublic 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));}}

Page 23: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

1 1 2 3 5 8 13 21 34 55 ...

Filme de Animação

Page 24: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Fibonacci

Definição Recursiva se n = 0 ou n = 1 → fib(n) = n

senão fib(n) = fib(n - 2) + fib(n - 1), n >1fib(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)

Page 25: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Sequência de Fibonacci – Definição Recursiva

Page 26: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Fibonaccipublic 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));

}}

Page 27: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

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

Page 28: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Busca Binária

Page 29: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

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 metade3. Se for maior procure na segunda metade

Animação de Busca Binária

Page 30: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Busca Binária

Page 31: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Busca Binária

1 2 3 4 5 6 7 8 9 10

A C E H L M P R T Z

Procurar por R

I FX I FX

-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?

Page 32: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Busca Binária Iterativa

Page 33: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Busca Binária Recursiva

Page 34: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

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)

Page 35: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

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

Page 36: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01
Page 37: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Desafio IQual a saída após a passagem pela função abaixo, quando n=4?

Page 38: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Desafio IIQual 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));

}}

Page 39: Curso de Análise e Desenvolvimento de Sistemas Estrutura de Dados e Algoritmos II  Aula 01

Desafio III