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