22.10.2014 Views

Aprendendo a Programar Programando em Linguagem C - FSM

Aprendendo a Programar Programando em Linguagem C - FSM

Aprendendo a Programar Programando em Linguagem C - FSM

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!