Técnicas de projeto de algoritmos: Indução

Documentos relacionados
MC102 Aula 26. Instituto de Computação Unicamp. 17 de Novembro de 2016

Programação Estruturada

Técnicas de projeto de algoritmos: Indução

Algoritmos de Ordenação

Classes, Herança e Interfaces

Revisão: Tipo Abstrato de Dados Recursividade

Técnicas de análise de algoritmos

04 Recursão SCC201/501 - Introdução à Ciência de Computação II

Introdução à Ciência da Computação II. Recursão. Prof. Ricardo J. G. B. Campello

Aula prática 5. Funções Recursivas

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

Aula 05: - Recursão (parte 1)

Recursividade. Estrutura de Dados. Prof. Kleber Rezende

Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Aula 05: - Recursão (parte 1)

Algoritmos de Ordenação: Tempo Linear

Teoria da Computação. Aula 4 Técnicas de Análise 5COP096. Aula 4 Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Algoritmos de Ordenação: HeapSort

Recursividade. Prof. Jesus José de Oliveira Neto

Algoritmos de Ordenação: MergeSort

Análise de Problemas Recursivos. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Recursão. Aula 1. Liana Duenha. Faculdade de Computação Universidade Federal de Mato Grosso do Sul

SCC Capítulo 2 Recursão

Algoritmos de Ordenação: QuickSort

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

Complexidade Assintótica

Recursividade. Objetivos do módulo. O que é recursividade

Análise e Complexidade de Algoritmos

ALGORITMOS AVANÇADOS UNIDADE II Recursividade. Luiz Leão

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição

Universidade Federal da Grande Dourados Faculdade de Ciências Exatas e Tecnologia Bacharelado em Sistemas de Informação Estruturas de Dados I Lista II

if not(isinstance(a, int)) or a < 0: raise ValueError ("misterio: arg nao e inteiro nao negativo") else: return misterio_aux(a, a + 1)

BCC402 Algoritmos e Programação Avançada Prof. Marco Antonio M. Carvalho Prof. Túlio Ângelo M. Toffolo 2011/1

Recursividade, Tentativa e Erro

BC1424 Algoritmos e Estruturas de Dados I Aula 03: Recursão / Recursividade

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Recursividade

QUESTÕES DE PROVAS ANTIGAS

Roteiro da segunda aula presencial - ME

Algoritmos de Ordenação: Cota Inferior

Paradigmas. Fortran, Algol, Algol-68, Pascal, C, Cobol, PL/I

Análise e Complexidade de Algoritmos

05 Análise de Algoritmos (parte 4) SCC201/501 - Introdução à Ciência de Computação II

Projeto de algoritmos: Algoritmos Gulosos

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Análise de Algoritmos Estrutura de Dados II

Recursividade. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS. Bruno Maffeo Departamento de Informática PUC-Rio

# Estrutura de Dados # Aula 08 Recursão (conceito, utilização, exemplos) Prof. Leinylson Fontinele Pereira

if not(isinstance(a, int)) or a < 0: raise ValueError ( misterio: arg devia ser inteiro nao negativo ) else: return misterio_aux(a, a + 1)

SCC0601 Projeto de Algoritmos. Recursão

Hashing. ACH Introdução à Ciência da Computação II. Delano M. Beder

PCC104 - Projeto e Análise de Algoritmos

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

MC102 Aula 27 Recursão II

Roteiro Prático Nº 13 Recursividade

Solução de Recorrências

Python: Recursão. Claudio Esperança

Algoritmos e Programação. AULA 21: Recursividade UNIVERSIDADE FEDERAL DE PELOTAS CENTRO DE DESENVOLVIMENTO TECNOLÓGICO CIÊNCIA DA COMPUTAÇÃO

Estruturas de Dados 2

Introdução à Análise Algoritmos

Indução Matemática. George Darmiton da Cunha Cavalcanti CIn - UFPE

Comparação com Divisão e Conquista

Recursividade Alguns problemas são definidos com base nos mesmos, ou seja, podem ser descritos por instâncias do próprio problema.

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

Matemática Discreta - 06

Lista Encadeada (Linked List)

Transcrição:

Técnicas de projeto de algoritmos: Indução ACH2002 - Introdução à Ciência da Computação II Delano M. Beder Escola de Artes, Ciências e Humanidades (EACH) Universidade de São Paulo dbeder@usp.br 08/2008 Material baseado em slides dos professores Marcos Chaim, Cid de Souza e Cândida da Silva Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 1 / 1

Indução Matemática Técnica matemática muito poderosa para provar asserções sobre números naturais. Seja T um teorema que desejamos provar. Suponha que T tenha como parâmetro um número natural n. Ao invés de provar diretamente que T é válido para todos os valores de n, basta provar as duas condições a seguir: 1 T é válido para n = 1 (passo base) 2 Para todo n > 1, se T é válido para n - 1, então T é válido para n (hipótese da indução ou passo indutivo). Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 2 / 1

Indução Matemática Normalmente, provar a condição 1 é relativamente fácil. Provar a condição 2 é mais fácil do que provar o teorema, pois pode-se utilizar do fato de que T é válido para n - 1. Por que a indução funciona? Por que as duas condições são suficientes? As condições 1 e 2 implicam que T é válido para n = 2. Se válido T é válido para n = 2, então pela condição 2 implica que T também é válido para 3, e assim por diante. O princípio da indução é um axioma dos números naturais. Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 3 / 1

Indução Matemática Exemplo 1 Considere a expressão de soma dos primeiros números naturais n, isto é, S(n) = 1 + 2 + + n. Provar por indução que S(n) = n (n+1) 2. Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 4 / 1

Indução Matemática Exemplo 1 Considere a expressão de soma dos primeiros números naturais n, isto é, S(n) = 1 + 2 + + n. Provar por indução que S(n) = n (n+1) 2. Prova: Passo base: Para n = 1, S(1) = 1 (trivial). Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 4 / 1

Indução Matemática Exemplo 1 Considere a expressão de soma dos primeiros números naturais n, isto é, S(n) = 1 + 2 + + n. Provar por indução que S(n) = n (n+1) 2. Prova: Passo base: Para n = 1, S(1) = 1 (trivial). Passo indutivo: Pelo princípio da indução matemática podemos assumir S(n 1) = (n 1) (n 1+1) 2 como válido. Mas S(n) = S(n 1) + n = (n 1) (n 1+1) 2 + n = n (n+1) 2. Assim, provamos o passo indutivo. Logo, S(n) = n (n+1) 2 para todo n 1. Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 4 / 1

Indução Matemática Exemplo 2 Prove por indução que 2 n > 2 n 1 + 2 n 2 + 2 n 3 +... + 2 0, n 1. Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 5 / 1

Indução Matemática Exemplo 2 Prove por indução que 2 n > 2 n 1 + 2 n 2 + 2 n 3 +... + 2 0, n 1. Prova: Passo base: Para n = 1, 2 1 > 2 0 (trivial). Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 5 / 1

Indução Matemática Exemplo 2 Prove por indução que 2 n > 2 n 1 + 2 n 2 + 2 n 3 +... + 2 0, n 1. Prova: Passo base: Para n = 1, 2 1 > 2 0 (trivial). Passo indutivo: Pelo princípio da indução matemática 2 n 1 > 2 n 2 + 2 n 3 +... + 2 0 é verdadeiro Somando 2 n 1 nos dois lados da inequação (lembrando que 2 n 1 é positivo e por isso não altera o sinal da inequação) obtemos: 2.2 n 1 > 2 n 1 + 2 n 2 + 2 n 3 +... + 2 0. Portanto, 2 n > 2 n 1 + 2 n 2 + 2 n 3 +... + 2 0. O passo indutivo está provado. Logo, 2 n > 2 n 1 + 2 n 2 + 2 n 3 +... + 2 0 para todo n 1. Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 5 / 1

Variações Variação 1 Caso base: n = 1 Provar que para n 2, se a propriedade é válida para n, ela é valida para n + 1. Variação 2 Caso base: n = 1, 2 e 3 Provar que para n 4, se a propriedade é válida para n, ela é valida para n + 1. Variação 3 (Indução forte) Caso base: n = 1 Provar que para n 2, se a propriedade é válida para 1 m n, ela é valida para n + 1. Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 6 / 1

Exercícios - Indução Matemática 1 Prove que 1 2 + 2 2 + 3 2 + + n 2 = 2n3 +3n 2 +n 6, n 1 2 Prove que 1 + 3 + 5 + + 2n 1 = n 2, n 1 3 Prove que 1 3 + 2 3 + 3 3 + + n 3 = n4 +2n 3 +n 2 4, n 1 4 Prove que 1 3 + 3 3 + 5 3 + + (2n 1) 3 = 2n 4 n 2, n 1 5 Prove que 1 + 2 + 2 2 + 2 3 + + 2 n = 2 n+1 1, n 0 6 Prove que 2 n n 2, n 4. 7 Prove que 1 1 1 2 + 1 3 + + 1 2n 1 1 2n = 1 n+1 + 1 n+2 + + 1 2n 8 Prove a soma dos cubos de três numeros naturais positivos sucessivos é divisível por 9. 9 Prove que todo número natural n > 1 pode ser escrito como o produto de primos (indução forte). 10 Prove que todo número natural positivo pode ser escrito como a soma de diferentes potências de 2 (indução forte). Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 7 / 1

Princípio da Recursão Definições recursivas de métodos são baseadas no princípio matemático da indução. A ideia é que a solução de um problema pode ser apresentada da seguinte forma: Primeiramente, definimos a solução para os casos básicos; Em seguida, definimos como resolver o problema para os demais casos, porém, de uma forma mais simples. Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 8 / 1

Usando Indução em Programação Problema: definir a multiplicação de dois números inteiros não negativos m e n, em termos da operação de adição Qual o caso base? Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 9 / 1

Usando Indução em Programação Problema: definir a multiplicação de dois números inteiros não negativos m e n, em termos da operação de adição Qual o caso base? Se n é igual a 0, então a multiplicação é 0. Qual seria o passo indutivo Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 9 / 1

Usando Indução em Programação Problema: definir a multiplicação de dois números inteiros não negativos m e n, em termos da operação de adição Qual o caso base? Se n é igual a 0, então a multiplicação é 0. Qual seria o passo indutivo Temos que expressar a solução para n > 0, supondo que já sabemos a solução para algum caso mais simples. m n = m + (m (n 1)). Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 9 / 1

Usando Indução em Programação Problema: definir a multiplicação de dois números inteiros não negativos m e n, em termos da operação de adição Qual o caso base? Se n é igual a 0, então a multiplicação é 0. Qual seria o passo indutivo Temos que expressar a solução para n > 0, supondo que já sabemos a solução para algum caso mais simples. m n = m + (m (n 1)). Portanto, a solução do problema pode ser expressa: m 0 = 0 m n = m + (m (n 1)) Como programar esta solução em Java? Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 9 / 1

Usando Indução em Programação class Aritr { } static int multr (int m, int n) { if(n == 0) { return 0; } else { return (m + multr(m, n-1)); } } Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 10 / 1

Utilizando Recursão Comando/ Resultado Estado Expressão (expressão) (após execução/avaliação) multr (3,2)... m > 3 n > 2 n == 0 false m > 3 n > 2 return m + multr (m,n-1)... m > 3 m > 3 n > 2 n > 1 n == 0 false m > 3 m > 3 n > 2 n > 1 return m + multr (m,n-1)... m > 3 m > 3 m > 3 n > 2 n > 1 n > 0 n == 0 true m > 3 m > 3 m > 3 n > 2 n > 1 n > 0 return 0 m > 3 m > 3 n > 2 n > 1 return m + 0 m > 3 n > 2 return m + 3 multr (3,2) 6 Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 11 / 1

Recursão Para solucionar o problema, é feita uma outra chamada para o próprio método, por isso, este método é chamado recursivo. Recursividade geralmente permite uma descrição mais clara e concisa dos algoritmos, especialmente quando o problema é recursivo por natureza. Cada chamada do método multr cria novas variáveis de mesmo nome m e n. Portanto, várias variáveis m e n podem existir em um dado momento. Em um dado instante, o nome (m ou n) refere-se à variável local ao corpo do método que está sendo executado. Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 12 / 1

Recursão As execuções das chamadas de métodos são feitas em uma estrutura de pilha. Pilha: estrutura na qual a inserção (ou alocação) e a retirada (ou liberação) de elementos é feita de maneira que o último elemento inserido é o primeiro a ser retirado. Assim, o último conjunto de variáveis alocadas na pilha corresponde às variáveis e aos parâmetros do último método chamado. O espaço de variáveis e parâmetros alocado para um método é chamado de registro de ativação desse método. O registro de ativação é desalocado quando termina a execução de um método. Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 13 / 1

Recursão Variáveis que podem ser usadas no corpo de um método: variáveis ou atributos de classe (static): criados uma única vez; variáveis ou atributos de instância: criados quando é criado um novo objeto (new); parâmetros e variáveis locais: criados cada vez que é invocado o método. Na criação de uma variável local a um método, se não for especificado um valor inicial, o valor armazenado será indeterminado. Indeterminado = valor existente nos bytes alocados para essa variável na pilha de chamada dos métodos. Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 14 / 1

Iteração class Aritr { static int multr (int m, int n) { int r = 0; for (int i = 1; i <= n; i++) { r += m; } } } return r; Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 15 / 1

Iteração Comando/ Resultado Estado Expressão (expressão) (após execução/avaliação) multr (3,2)... m > 3, n > 2 int r = 0... m > 3, n > 2, r > 0 int i = 1 m > 3, n > 2, r > 0, i > 1 i <= n true m > 3, n > 2, r > 0, i > 1 r+=m 3 m > 3, n > 2, r > 3, i > 1 i++ 2 m > 3, n > 2, r > 3, i > 2 i <= n true m > 3, n > 2, r > 3, i > 2 r+=m 6 m > 3, n > 2, r > 6, i > 2 i++ 3 m > 3, n > 2, r > 6, i > 3 i <= n false m > 3, n > 2, r > 6, i > 3 for... m > 3, n > 2, r > 6 return r 6 m > 3, n > 2, r > 6 mult(3,2) 6 Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 16 / 1

Recursão x Iteração Soluções recursivas são geralmente mais concisas que as iterativas. Programas mais simples. Soluções iterativas em geral têm a memória limitada enquanto as recursivas, não. Cópia dos parâmetros a cada chamada recursiva é um custo adicional para as soluções recursivas. Programas recursivos que possuem chamadas no final do código são ditos terem recursividade de cauda. São facilmente transformáveis em uma versão não recursiva. Projetista de algoritmos deve levar consideração a complexidade (temporal e espacial), bem como os outros custos (e.g., facilidade de manutenção) para decidir por qual solução utilizar. Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 17 / 1

Exercícios 1 Forneça soluções recursivas para os problemas abaixo cálculo do fatorial de um número. cálculo do elemento n da série de Fibonacci. f 0 = 0, f 1 = 1, f n = f n 1 + f n 2 para n >= 2. busca binária. 2 Como faço para calcular a complexidade (temporal ou espacial) de um algoritmo recursivo? 3 Escreva um método recursivo que calcule a soma dos elementos positivos do vetor de inteiros v[0..n 1]. O problema faz sentido quando n é igual a 0? Quanto deve valer a soma nesse caso? (Retirado de [1]) 4 Escreva um método recursivo maxmin que calcule o valor de um elemento máximo e o valor de um elemento mínimo de um vetor v[0..n 1]. Quantas comparações envolvendo os elementos do vetor a sua função faz? (Retirado de [1]) Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 18 / 1

Exercícios 5 Escreva um método recursivo que calcule a soma dos elementos positivos do vetor v[ini..fim 1]. O problema faz sentido quando ini é igual a fim? Quanto deve valer a soma nesse caso? (Retirado de [1]) 6 Escreva um método recursivo que calcule a soma dos dígitos de um inteiro positivo n. A soma dos dígitos de 132, por exemplo, é 6. (Retirado de [1]) 7 Escreva um método recursivo onde(). Ao receber um inteiro x, um vetor v e um inteiro n, o método deve devolver j no intervalo fechado 0... n 1 tal que v[j] == x. Se tal j não existe, o método deve devolver -1. (Retirado de [1]) 8 Escreva um método recursivo que recebe um inteiro x, um vetor v e inteiros ini e fim e devolve j tal que ini j fim 1 e v[j] == x. Se tal j não existe então devolve ini-1. (Retirado de [1]) Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 19 / 1

Referências Referências utilizadas: [1] (Capítulo 5) e [2] (páginas 35-42). [1] C. Camarão & L. Figueiredo. Programação de Computadores em Java. Livros Técnicos e Científicos Editora, 2003. [2] N. Ziviani. Projeto de Algoritmos com implementações em C e Pascal. Editora Thomson, 2a. Edição, 2004. Delano M. Beder (EACH - USP) Indução - Parte I ACH2002 20 / 1