Difference between revisions of "Técnicas Avançadas de Contagem"
Line 56: | Line 56: | ||
Em seguida, o procedimento recursivo TransferDisk faz a maior parte do trabalho para nós. Esta função modela a ideia de transferir um disco de um Peg para outro. Mas, porque é recursivo, precisamos fornecer a ele, como um argumento, o número total de discos a serem tratados em cada chamada. | Em seguida, o procedimento recursivo TransferDisk faz a maior parte do trabalho para nós. Esta função modela a ideia de transferir um disco de um Peg para outro. Mas, porque é recursivo, precisamos fornecer a ele, como um argumento, o número total de discos a serem tratados em cada chamada. | ||
+ | |||
+ | |||
+ | TransferDisk := proc(src::string, via::string, | ||
+ | dest::string, ndisks::posint) | ||
+ | if ndisks = 1 then | ||
+ | PrintMove(src, dest); | ||
+ | else | ||
+ | TransferDisk(src, via, dest, ndisks -1); | ||
+ | PrintMove(src, dest); | ||
+ | TransferDisk(via, dest, src, ndisks -1); | ||
+ | fi; | ||
+ | end: | ||
+ | |||
+ | |||
+ | Finalmente, empacotamos em um procedimento de alto nível, Hanoi, proporcionando assim uma interface para o mecanismo recursivo. | ||
+ | |||
+ | Hanoi := proc(ndisks::posint) | ||
+ | if ndisks < 1 then | ||
+ | printf(`What's wrong with this picture?`); | ||
+ | else | ||
+ | TransferDisk(`A`, `B`, `C`, ndisks); | ||
+ | fi; | ||
+ | end: | ||
+ | |||
+ | Nosso programa Hanoi program consegue exibir uma solução específica para o enigma das Tcan exhibit a specific solution to the Torres de Hanoi para qualquer número n de discos. | ||
+ | |||
+ | Hanoi(2); | ||
+ | Hanoi(3); | ||
+ | |||
+ | Tente experimentar com diferentes valores n de discos para ter uma noção do quão grande o problema se torna mesmo para valores moderadamente grandes de n discos. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | '''2. Resolução de recorrências com Maple''' | ||
+ | |||
+ | Agora que sabemos como implementar relações de recorrência em Maple, e temos trabalhado com eles um pouco, vamos ver como usar Maple para resolver certos tipos de relações de recorrência. | ||
+ | |||
+ | Maple tem um poderoso solucionador de recorrência, rsolver, que discutiremos mais tarde. A sua utilização, no entanto, pode obscurecer algumas das ideias importantes que estão envolvidas. Portanto, devemos primeiro usar algumas das instalações mais rudimentares do Maple para resolver certos tipos de relações de recorrência, um passo de cada vez. | ||
+ | |||
+ | Dada uma seqüência definida recursivamente <math> \ {r_ {n} \} </math>, o que nós gostaríamos é encontrar algum tipo de fórmula, envolvendo apenas o índice n (e, talvez, outras constantes fixas e funções conhecidas) que não dependem do conhecimento da valor de r_ {k}, por qualquer índice k. | ||
+ | |||
+ | Para começar, vamos considerar relações de recorrência que são lineares, homogêneas, e que têm coeficientes constantes; ou seja, eles têm a forma | ||
+ | |||
+ | <math> r_{n} = a_{1}r_{n-1} + a_{2}r_{n-2} + \cdots + a_{k}r_{n-k} </math> | ||
+ | |||
+ | onde <math> a_{1}, a_{2}, \ldots , a_{k} </math> são constantes reais e <math> a_{k} </math> é diferente de zero. Lembre-se que o inteiro k é chamado de grau da relação de recorrrência. Para ter uma núnica solução, pelo menos o k inicial deve sere especificado. |
Revision as of 23:08, 25 November 2015
Neste capítulo vamos descrever como usar Maple para trabalhar com três temas importantes na contagem: relações de recorrência, inclusão-exclusão e funções geradoras. Começamos por descrever como Maple pode ser usado para resolver relações de recorrência, incluindo a relação de recorrência para a sequência de números de Fibonacci. Em seguida, mostramos como resolver o enigma da Torre de Hanói e encontramos o número de movimentos necessários para n discos. Descrevemos como Maple pode ser utilizada para resolver as relações lineares homogêneas de recorrência com coeficientes constantes, bem como as relações de recorrência não-homogêneas relacionadas. Depois de descrever como resolver estes tipos especiais de relações de recorrência com Maple, vamos mostrar como usar a resolução geral de recorrência Mapple. Nós ilustramos o uso dessa resolução geral demonstrando como usa-la para resolver divide and conquer relações de recorrência. Depois de estudar relações de recorrência, vamos mostrar como usar bordo para ajudar a resolver problemas usando o princípio da inclusão e exclusão. Ao fim, discutimos como Maple pode ser usado para trabalhar com funções geradoras, um tema abordado no Apêndice 3 no texto.
1. Relações de recorrência
Uma relação de recorrência descreve uma relação que um membro de uma sequência {} de valores tem de outro membro da seqüência que o precedem. Por exemplo, a famosa seqüência de Fibonacci {} satisfaz a relação de recorrência
Juntamente com as condições iniciais e , esta relação é suficiente para definir toda a seqüência
Em geral, podemos pensar em uma relação de recorrência como uma relação do formulário
,
em que cada termo da sequência depende de um número k dos termos que o precedem na seqüência. Por exemplo, para a sequência de Fibonacci, a função F é .
Para entender como podemos trabalhar com relações de recorrência em Maple, temos de parar por um momento e perceber que uma sequência de valores (números, matrizes, círculos, funções, etc.) é apenas uma função cujo domínio passa a ser o conjunto de inteiros (geralmente positivos). Se queremos levar este ponto de vista (e nós queremos!), então o enésimo termo de uma sequência de {} seria convencionalmente escrito como , e gostaríamos de referir à função r. Desta forma, podemos pensar na seqüência {} como uma forma de representar uma função cujo domínio é o conjunto de números inteiros positivos, e cujo valor no número é apenas . Isto apenas equivale a uma mudança na notação; não há nada mais do que isso.
Uma vez que esta alteração na notação for feita, então é fácil ver como representar uma relação de recorrência como um procedimento Maple tendo argumentos inteiros.
No capítulo 3 descobrimos como representar de forma eficiente a seqüência de Fibonacci pelo procedimento:
Fibonacci := proc(n::posint) option remember; if n = 1 or n = 2 then RETURN( 1 ); fi; Fibonacci2(n-1) + Fibonacci2(n-2);
Lembre-se que a primeira linha deste procedimento instrui a Maple de lembrar que quaisquer sejam os valores do processo já foram calculado na sessão atual.
Às vezes, apesar de nossos melhores esforços, uma aplicação recursiva de um algoritmo pode ser muito caro, simplesmente devido à sua própria natureza. A aplicação recursiva pode ser evitado se podemos encontrar uma fórmula explícita para o termo geral da recorrência. O processo de encontrar uma fórmula explícita é referido como resolver a recorrência. Na próxima seção, veremos como usar Maple para fazer isso por certos tipos de relações de recorrência.
1.1 Torre de Hanoi
O famoso enigma conhecido como Torre de Hanoi é discutido no texto, onde a relação de recorrência:
é derivada, em que indica o número de movimentos necessários para resolver o enigma para n discos. Como discutido no texto, este tem a solução
Mais tarde, veremos como usar Maple para obter esse resultado de forma simples.
Além de resolver para o número de movimentos necessários para resolver o enigma das Torres de Hanói para para n discos, podemos ilustrar a solução escrevendo um programa em Maple para calcular os movimentos necessários para resolver o dito problema, e descrevendo-os para nós. Nós vamos escrever um pequeno programa em Maple que consiste em três procedimentos: o principal programa de Hanói, a rotina utilitária PrintMove , e o mecanismo recursivo do programa TransferDisk, que faz a maioria do trabalho.
A parte mais fácil de escrever é a função PrintMove, que apenas mostra para nós a mudança para fazer em um determinado passo.
PrintMove: = proc (src :: string, dest :: string) printf (`Mova disco de peg% s para peg% s`, src, dest); end:
Aqui, nós apenas chamamos o comando printf da biblioteca do Maple, que pode ser usado para saída formatada. A função printf tem uma sintaxe de chamada complexa; consulte a ajuda online para obter detalhes e informações adicionais. (Nota: Se você estiver familiarizado com a função printf em C, então você vai achar que a versão do Maple do printf é bem semelhante. Neste caso, os símbolos %s acima são substituídos pelos valores de string do segundo e terceiro argumentos, respectivamente.)
Em seguida, o procedimento recursivo TransferDisk faz a maior parte do trabalho para nós. Esta função modela a ideia de transferir um disco de um Peg para outro. Mas, porque é recursivo, precisamos fornecer a ele, como um argumento, o número total de discos a serem tratados em cada chamada.
TransferDisk := proc(src::string, via::string, dest::string, ndisks::posint) if ndisks = 1 then PrintMove(src, dest); else TransferDisk(src, via, dest, ndisks -1); PrintMove(src, dest); TransferDisk(via, dest, src, ndisks -1); fi; end:
Finalmente, empacotamos em um procedimento de alto nível, Hanoi, proporcionando assim uma interface para o mecanismo recursivo.
Hanoi := proc(ndisks::posint) if ndisks < 1 then printf(`What's wrong with this picture?`); else TransferDisk(`A`, `B`, `C`, ndisks); fi; end:
Nosso programa Hanoi program consegue exibir uma solução específica para o enigma das Tcan exhibit a specific solution to the Torres de Hanoi para qualquer número n de discos.
Hanoi(2); Hanoi(3);
Tente experimentar com diferentes valores n de discos para ter uma noção do quão grande o problema se torna mesmo para valores moderadamente grandes de n discos.
2. Resolução de recorrências com Maple
Agora que sabemos como implementar relações de recorrência em Maple, e temos trabalhado com eles um pouco, vamos ver como usar Maple para resolver certos tipos de relações de recorrência.
Maple tem um poderoso solucionador de recorrência, rsolver, que discutiremos mais tarde. A sua utilização, no entanto, pode obscurecer algumas das ideias importantes que estão envolvidas. Portanto, devemos primeiro usar algumas das instalações mais rudimentares do Maple para resolver certos tipos de relações de recorrência, um passo de cada vez.
Dada uma seqüência definida recursivamente Failed to parse (MathML with SVG or PNG fallback (recommended for modern browsers and accessibility tools): Invalid response ("Math extension cannot connect to Restbase.") from server "https://wikimedia.org/api/rest_v1/":): {\displaystyle \ {r_ {n} \} } , o que nós gostaríamos é encontrar algum tipo de fórmula, envolvendo apenas o índice n (e, talvez, outras constantes fixas e funções conhecidas) que não dependem do conhecimento da valor de r_ {k}, por qualquer índice k.
Para começar, vamos considerar relações de recorrência que são lineares, homogêneas, e que têm coeficientes constantes; ou seja, eles têm a forma
onde são constantes reais e é diferente de zero. Lembre-se que o inteiro k é chamado de grau da relação de recorrrência. Para ter uma núnica solução, pelo menos o k inicial deve sere especificado.