• Nenhum resultado encontrado

Equações de Recorrência Determinação Delas Fórmulas Fechadas (Conjecturas)

3. EQUAÇÕES DE RECORRÊNCIA e PROVAS POR INDUÇÃO MATEMÁTICA

3.1. Equações de Recorrência Determinação Delas Fórmulas Fechadas (Conjecturas)

3.3. Provas pelo Princípio de Indução Matemática Completa (ou Forte)

Se você quiser ver o assunto mais explicado e profundamente, não precisará de mais que os livros textos da ementa da disciplina. Mas, se ademais ou ao invés deles, quiser algo gratuito ou da internet, talvez possa começar por Indução Matemática, Abramo Hefez, http://server22.obmep.org.br:8080/media/servicos/recursos/296654.o; ou Indução e Indução Matemática, palestra de José Morgado

http://nautilus.fis.uc.pt/bspm/revistas/17/023-034.150.pdf. Agradeço ao aluno Túlio Albuquerque Pascoal por ter ajudado a revisar esta unidade.

3.1. Equações de Recorrência. Determinação Delas.

Fórmulas Fechadas (Conjecturas)

• Uma Relação de Recorrência ou Equação de Recorrência é aquela que, em parte de sua definição, diz como resolver diretamente a menor e mais simples possível instância do problema, e nisso não faz referência a nenhuma outra instância do problema; e, no restante da sua definição, diz como resolver instâncias maiores e mais complexas do problema, nisso usando, fazendo referência a uma ou mais de suas instâncias menores. Em outras palavras, uma recorrência é uma expressão que dá o valor de uma função em termos dos valores "anteriores" da mesma função. Uma função recursiva f(n) é definida em termos de valores para f(m), onde m < n.

EXEMPLO 1:

a) No domínio dos naturais, você define fatorial de n como 1, se n for 0; e define como n vezes fatorial de n- 1, se n for maior que 0:

n! = 1 caso n = 0 n! = n(n-1)! caso n > 0

b) Você define a relação binária “É_Ancestral_De” assim:

x É_Ancestral_De z SE x É_Pai_Ou_Mãe_De y E y É_Ancestral_De z. OU

x É_Ancestral_De y SE x É_Pai_Ou_Mãe_De y.

c) No domínio dos naturais não nulos {1,2,3,...}, você define a soma dos n primeiros deles como sendo 1 se n for 1, e como sendo n mais a soma dos n-1 primeiros naturais, se n for maior que 1:

S(n) = 1 caso n=1 S(n) = n + S(n-1) caso n>1

d) (Prof. Becceneri, INPE): Um processo cria memória dinamicamente. Inicialmente, aloca 64 MB

(chamemos isto de M0). A cada iteração exige mais 15% de memória. Então, as equações de recorrência

para este problema são (complete): Mi = 64 para i = 0

Mi = 1,15Mi-1 para i > 0

e) n está no domínio dos naturais não nulos, e você sabe que uma certa função f de n vale 1 para n=1, e, nos demais casos, vale o valor anterior (f(n-1)) mais 3n mais 2. Escreva as equações de recorrência:

f(n) = 1 caso n=1

f(n) =f(n-1) +3n + 2 caso n>1

• Uma recorrência pode ser vista como um algoritmo recursivo que calcula uma função a partir de um "valor inicial”. Talvez haja um fundo de verdade em quem diz que “saber programar é saber achar algoritmos recursivos, e vice-versa, e ambas essas coisas equivalem à proficiência em achar definições recursivas para funções.” Achamos que, se isso não for totalmente verdade, tem um certo fundo de verdade, e isso é bom. Nesta unidade, primeiramente invistamos em achar definições recursivas, pois isto vai lhe ajudar muito a programar, no futuro. E, em segundo lugar, invistamos também em achar fórmulas fechadas para recursões e prová-las rigorosamente, por indução, pois isto vai ajudá-lo a descobrir como é fácil errarmos em pensar que uma recursão ou loop estão totalmente corretos, e vai nos ensinar a ser mais cuidadosos, e a identificar e corrigir esses erros, e a saber provar a corretude de programas (mesmo os iterativos).

• Resolver um sistema de equações recorrentes é encontrar uma fórmula fechada que lhe seja solução. Uma fórmula fechada, ou solução explícita, dá o valor da função recursiva diretamente em termos do seu argumento, sem referência a nenhum valor da função para uma instância menor do problema. Tipicamente, uma fórmula fechada é uma combinação de polinômios, de quocientes de polinômios, de logaritmos, de exponenciais, etc. Só não pode ter recorrência dentro dela, isto é, não pode se referir a instâncias menores do problema, mesmo que disfarçadas dentro de somatórios () e produtórios () e loops de programas.

EXEMPLO 2: Ache a fórmula fechada para os problemas c, d, e, do exemplo acima. RESPOSTA:

c) Temos uma progressão aritmética de n termos, primeiro termo (chamado de S(1)) 1, e razão 1, e a fórmula da soma dos termos de uma P.A. nos dá

S(n) = n(1+n)/2, para n ≥ 1

d) Temos uma progressão geométrica de n+1 termos, primeiro termo (chamado M0) 64, e quociente 1,15, e

a fórmula da soma dos termos de uma P.G. nos dá

64(1,15n+1 -1)/(1,15 – 1) = 64(1,15n+1 -1)/0,15 = 426,667(1,15n+1 -1) para n ≥ 0

e) A resposta é (3n²)/2 + 7n/2 – 4. Bem, é bastante fácil você verificar que a resposta está correta para qualquer n relativamente pequeno (1,2,3,4,5,6,...); dentro de poucas páginas você aprenderá a provar por indução que a fórmula é válida para todo natural não nulo; mas o mais difícil é como chegar ao começo de tudo, isto é, como “adivinhar” que a resposta, a fórmula fechada, é essa. Isso você só começará a ver, de

leve, no exemplo 7, e, em casos mais difíceis (como o problema 2, muito difícil), talvez no mestrado, em cursos sobre Análise de Complexidade de Algoritmos (método de adivinhação inteligente, substituição, árvores de recorrência, etc.)

EXEMPLO 3: Considere o algoritmo recursivo abaixo, para o conhecido problema da Torre de Hanói (não se preocupe nada com a linguagem, com detalhes, só se preocupe com a ideia principal, geral e superficial do algoritmo. E nem se preocupe em entender bem o algoritmo e seu funcionamento real, a baixo nível. Basta que você se concentre em contar cada movimento de um só disco

http://upload.wikimedia.org/wikipedia/commons/thumb/6/60/Tower_of_Hanoi_4.gif/300px-Tower_of_Hanoi_4.gif): procedure Hanói(De, Para, Aux, n):

se n>1 então Hanói(De,Aux,Para,n-1) mova disco de De para Para Hanói(Aux,Para,De,n-1)

senão mova disco do topo de De para Para

Quais as equações de recorrência para o tempo de execução? (Repetimos: assuma que basta contar os movimentos dos discos)

RESPOSTA:

Pelo exame do algoritmo (pense bem, examinando-o), concluímos que as equações de recorrência são: T(n) = T(n-1) + 1 + T(n-1) = 2T(n-1) + 1 caso n > 1

T(n) = 1 caso n = 1

EXEMPLO 4: Um procedimento recursivo consome 1 unidade de tempo se o tamanho (n) do problema é 1. Caso contrário, o procedimento divide o problema de tamanho n em 3 partes de tamanhos os mais iguais possíveis a n/3, resolve-os recursivamente, depois ajunta as soluções parciais formando a solução mais geral, e gasta um tempo nlog3n para fazer a divisão mais a junção. Quais as equações de recorrência para

o tempo de execução deste algoritmo? RESPOSTA:

T(n) = 1 para n = 1

T(n) = 3T(n/3) + nlog3n para n > 1

EXEMPLO 5: Eis o algoritmo para pesquisa binária por um valor Chave em um arranjo ordenado A[] cujo menor índice é IMin e maior índice é IMax. Se a pesquisa encontrar Chave, retorna a posição onde a encontrou:

int PesqBinaria(int A[], int Chave, int IMin, int IMax) {

// teste se o arranjo está vazio if (IMax < IMin):

// o arranjo está vazio, portanto retorne algo que signifique que Chave não foi encontrada return Chave_NÃO_ENCONTRADA;

else {

// calcule o ponto central, para dividir a faixa do arranjo em duas metades int IMeio = (IMin + IMax) divisãointeira 2;

// comparação que tem 3 possibilidades if (A[IMeio] > Chave)

// Chave está na metade mais baixa da faixa de A return PesqBinaria(A, Chave, IMin, IMeio-1); else if (A[IMeio] < Chave)

// Chave está na metade mais alta da faixa de A return PesqBinaria(A, Chave, IMeio+1, IMax); else

// Chave foi encontrada return IMeio;

} }

Quais as equações de recorrência para o tempo de execução deste algoritmo? Assuma que só o que importa é o tempo de comparação.

RESPOSTA: T(1) = 1

EXEMPLO 6: Procure a definição recursiva do algoritmo de ordenação MergeSort, e escreva as equações de recorrência para seu tempo de execução, considerando que só importa o tempo das comparações.

RESPOSTA:

T(n) = 2T(n/2) + n para n>1 T(1) = 1