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. (A, 1), (B, 0).<br />
6. (A, 0), (B, 1).<br />
7. (A, 3), (B, 1).<br />
8. (A, 0), (B, 4).<br />
Outras questões que pod<strong>em</strong> ser levantadas são: há outras soluções? Existe alguma solução que realize<br />
a mesma tarefa com uma quantidade menor de instruções? Para responder a estas questões talvez seja<br />
interessante l<strong>em</strong>brar que 4 = 5 – 1. Significa que, se conseguirmos tirar 1 litro do recipiente de 5 litros<br />
quando ele estiver cheio, resolver<strong>em</strong>os a questão. Para conseguir isto, basta que o recipiente de 3 litros<br />
contenha 2 litros. E para se obter 2 litros? Aí basta ver que 2 = 5 – 3. Pod<strong>em</strong>os então resolver a questão com<br />
o seguinte algoritmo, constituído de apenas seis instruções:<br />
1. Encha o recipiente de 5 litros.<br />
2. Com o conteúdo do recipiente de 5 litros, encha o de 3 litros.<br />
3. Esvazie o recipiente de 3 litros.<br />
4. Transfira o conteúdo do recipiente de 5 litros para o recipiente de 3 litros.<br />
5. Encha o recipiente de 5 litros.<br />
6. Com o conteúdo do recipiente de 5 litros, complete o recipiente de 3 litros.<br />
Após a execução de cada uma das instruções ter<strong>em</strong>os:<br />
1. (A, 0), (B, 5).<br />
2. (A, 3), (B, 2).<br />
3. (A, 0), (B, 2).<br />
4. (A, 2), (B, 0).<br />
5. (A, 2), (B, 5).<br />
6. (A, 3), (B, 4).<br />
Uma outra técnica bastante utilizada é se tentar raciocinar a partir de uma solução conhecida de uma<br />
outra questão. Para compreender isto considere as duas seguintes questões: imagine uma relação de n<br />
números, os quais pod<strong>em</strong> ser referenciados por a i com i = 1, 2, ..., n e queiramos somá-los com a restrição de<br />
que só sab<strong>em</strong>os efetuar somas de duas parcelas. Para resolver esta questão, pod<strong>em</strong>os pensar <strong>em</strong> casos<br />
particulares: se n = 2, basta somar os dois números; se n = 3, basta somar os dois primeiros e somar esta<br />
soma com o terceiro. Naturalmente este raciocínio pode ser reproduzido para n > 3. A questão é que a soma<br />
dos dois primeiros deve estar "guardada" para que se possa somá-la com o terceiro, obtendo-se a soma dos<br />
três primeiros; esta soma deve ser "guardada" para que seja somada com o quarto e assim sucessivamente.<br />
Para isto pod<strong>em</strong>os estabelecer uma referência à soma "atual", a qual será alterada quando a soma com o<br />
el<strong>em</strong>ento seguinte for efetuada. Até para somar os dois primeiros, pode-se pensar <strong>em</strong> somar "a soma do<br />
primeiro" com o segundo.<br />
T<strong>em</strong>os então o seguinte algoritmo:<br />
1. Faça i = 1.<br />
2. Faça Soma = a 1 .<br />
3. Repita n – 1 vezes as instruções 3.1 e 3.2.<br />
3.1. Substitua i por i + 1.<br />
3.2. Substitua Soma por Soma + a i .<br />
Por ex<strong>em</strong>plo: se n = 5 e a 1 = 8, a 2 = 4, a 3 = 9, a 4 = 13 e a 5 = 7, a execução do algoritmo resultaria nas<br />
seguintes ações:<br />
1. i = 1.<br />
2. Soma = 8.<br />
3.1.1. i = 2.<br />
3.2.1. Soma = 8 + 4 = 12<br />
3.1.2. i = 3.<br />
3.2.2. Soma = 12 + 9 = 21.<br />
3.1.3. i = 4.<br />
3.2.3. Soma = 21 + 13 = 34.<br />
3.1.4. i = 5.<br />
3.2.4. Soma = 34 + 7 = 41.<br />
Naturalmente, na execução acima estamos indicando por 3.1.x e 3.2.x a execução de ord<strong>em</strong> x das