390 likes | 548 Views
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.
E N D
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, “Socorram-me, 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 publicclassPalindromo { static char[ ] arr = {‘a',‘n','a'}; public static void main(String[ ] args) { booleanisPalindromo = true; for (inti = 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 O triângulo de Sierpinski - uma recursão fechada de triângulos formando uma reticulada geométrica.
Recursividade • Definição de um algoritmo de maneiraiterativa • X • Definição de um algoritmo de maneirarecursiva
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)
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) { intn = 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 • Divide seu vetor em duas metades • Três condições • Se o item for igual ao item que está na metade do vetor, o item foi encontrado • Se for menor, procure na primeira metade • Se for maior procure na segunda metade Animação de Busca Binária
X I F X I F Busca Binária Procurar por R • -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?
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)); } }