Aprendendo a Programar Programando em Linguagem C - FSM
Aprendendo a Programar Programando em Linguagem C - FSM
Aprendendo a Programar Programando em Linguagem C - FSM
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
5 - Após a ativação de Fat(1)<br />
Fat(5) n Fat(4) n Fat(3) n Fat(2) n<br />
5*Fat(4) 5 4*Fat(3) 3 3*Fat(2) 2 2*1 = 2 1<br />
Fat(5) n Fat(4) n Fat(3) n<br />
5*Fat(4) 5 4*Fat(3) 3 3*2 = 6 2<br />
Fat(5) n Fat(4) n<br />
5*Fat(4) 5 4*6 = 24 3<br />
Fat(5) n<br />
5*24 = 120 5<br />
Embora a utilização da recursividade apresente a vantag<strong>em</strong> de programas mais simples, ela t<strong>em</strong> o<br />
inconveniente de sacrificar a eficiência do programa. Isto ocorre devido à necessidade de chamadas<br />
sucessivas da função e das operações de <strong>em</strong>pilhamento e des<strong>em</strong>pilhamento, o que d<strong>em</strong>anda um t<strong>em</strong>po maior<br />
de computação e uma maior necessidade de uso de m<strong>em</strong>ória. Esta observação faz com que a solução não<br />
recursiva (chamada, como já diss<strong>em</strong>os, função iterativa) seja preferível. No capítulo 7 apresentar<strong>em</strong>os um<br />
ex<strong>em</strong>plo de uma função recursiva que é tão eficiente quanto a função iterativa.<br />
Mesmo funções que não possuam intrinsecamente um definição recursiva pode ser impl<strong>em</strong>entada<br />
recursivamente, muitas das vezes com uma lógica mais fácil de compreender do que a da solução iterativa.<br />
Por ex<strong>em</strong>plo, a função que determina o máximo divisor comum de dois inteiros dados apresentada na seção<br />
5.1 pode ser escrita recursivamente da seguinte forma:<br />
/*Função recursiva que retorna o máximo divisor comum de dois inteiros positivos dados*/<br />
int MaxDivCom(int x, int y)<br />
{<br />
int Resto;<br />
Resto = x % y;<br />
if (Resto == 0)<br />
return y;<br />
else<br />
return MaxDivCom(y, Resto);<br />
}<br />
Um outro ex<strong>em</strong>plo interessante de recursividade é a impl<strong>em</strong>entação do jogo conhecido como Torre de<br />
Hanói, jogo que consiste <strong>em</strong> três torres chamadas orig<strong>em</strong>, destino e auxiliar e um conjunto de n discos de<br />
diâmetros diferentes, colocados na torre orig<strong>em</strong>, na ord<strong>em</strong> decrescente dos seus diâmetros. O objetivo do<br />
jogo é, movendo um único disco de cada vez e não podendo colocar um disco sobre outro de diâmetro<br />
menor, transportar todos os discos para pilha destino, podendo usar a torre auxiliar como passag<strong>em</strong><br />
intermediária dos discos.<br />
Indicando torre 1 → torre 2 o movimento do disco que no momento está parte superior da<br />
torre 1 para a torre 2, teríamos a seguinte solução para o caso n = 2:<br />
1. orig<strong>em</strong> → auxiliar<br />
2. orig<strong>em</strong> → destino<br />
3. auxiliar → destino<br />
Para n = 3, a solução seria:<br />
1. orig<strong>em</strong> → destino<br />
2. orig<strong>em</strong> → auxiliar<br />
3. destino → auxiliar<br />
4. orig<strong>em</strong> → destino<br />
5. auxiliar → orig<strong>em</strong><br />
6. auxiliar → destino