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.

Desta forma, o fatorial de n é definido a partir dos fatoriais dos naturais menores que ele. Isto significa<br />

que para o cálculo do fatorial de um determinado número natural há necessidade de que se recorra aos<br />

fatoriais dos naturais anteriores. Por ex<strong>em</strong>plo, 4! = 4 . 3! = 4 . (3 . 2!) = (4 . 3) . (2 . 1!) = 4 . 3 . 2 . 1 = 24.<br />

Uma definição com estas características é dita uma definição por recorrência ou uma definição recursiva.<br />

Um outro ex<strong>em</strong>plo de uma definição recursiva foi dada no exercício 12 da seção 4.5: a sequência de<br />

Fibbonaci é a sequência (a n ) definida por<br />

⎧1,<br />

se n = 1 ou n = 2<br />

Fibb(<br />

n)<br />

= ⎨<br />

⎩ Fibb(<br />

n − 1) + Fibb(<br />

n − 2), se n > 2<br />

Observe que o termo de ord<strong>em</strong> n é definido a partir de termos anteriores. Isto significa que para o<br />

cálculo de um determinado termo há necessidade de que se recorra a valores de todos os termos anteriores.<br />

Por ex<strong>em</strong>plo, para a determinação de a 5 necessitamos conhecer a 4 e a 3 ; para a determinação destes dois,<br />

necessitamos conhecer a 2 e a 1 .<br />

Naturalmente, uma definição recursiva deve conter uma condição que interrompa a recorrência. Esta<br />

condição é chamada condição de escape. No caso do fatorial a condição de escape é n = 0 ou n = 1; na<br />

sequência de Fibbonaci, a condição de escape é n = 1 ou n = 2. A expressão que realiza propriamente a<br />

recorrência pode ser chamada expressão de recorrência<br />

O surpreendente é que os ambientes para desenvolvimento de programas, de um modo geral,<br />

oferec<strong>em</strong> recursos para impl<strong>em</strong>entação de funções recursivas da mesma maneira que elas são<br />

escritas <strong>em</strong> mat<strong>em</strong>ática. Por ex<strong>em</strong>plo, a impl<strong>em</strong>entação recursiva do fatorial <strong>em</strong> C pode ser feita<br />

simplesmente da seguinte forma:<br />

long int FatRec(int n)<br />

{<br />

if ((n == 0) || (n == 1))<br />

return (1);<br />

else<br />

return (n * FatRec(n - 1));<br />

}<br />

É interessante ter uma ideia do que acontece na recursividade. Quando se ativa uma função recursiva,<br />

cada nova chamada da mesma é <strong>em</strong>pilhada na chamada pilha de m<strong>em</strong>ória, até que a condição de escape é<br />

atingida. A partir daí, cada ativação pendente é des<strong>em</strong>pilhada (evident<strong>em</strong>ente, na ord<strong>em</strong> inversa do<br />

<strong>em</strong>pilhamento) e as operações vão sendo realizadas.<br />

Se ativarmos a função acima com n = 5 (com um comando printf("%d"%, FatRec(5)), por<br />

ex<strong>em</strong>plo) teríamos a seguinte sequência de operações:<br />

1 - Após a ativação de Fat(5)<br />

Fat(5) n<br />

5*Fat(4) 5<br />

2 - Após a ativação de Fat(4)<br />

Fat(5) n Fat(4) n<br />

5*Fat(4) 5 4*Fat(3) 3<br />

3 - Após a ativação de Fat(3)<br />

Fat(5) n Fat(4) n Fat(3) n<br />

5*Fat(4) 5 4*Fat(3) 3 3*Fat(2) 2<br />

4 - Após a ativação de Fat(2)<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*Fat(1) 1

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

Saved successfully!

Ooh no, something went wrong!