paulo1205
(usa Ubuntu)
Enviado em 27/09/2013 - 11:08h
kaiio_ escreveu:
Teste de mesa é o seguinte: você opera o programa, vendo suas funcionalidades, o que ocorre. Obviamente, deve-se conhecer as funções do programa.
Por exemplo, no seu caso existe a variável n.
Então, atribua um valor a ela, por exemplo 1.
Não "cai" no primeiro if, cai no segundo, e retorna 1.
Ok, fim do programa.
Atribua 0.
"Cai" no primeiro if, retorna 1.
Atribua 2.
Passa pelos 2 ifs, faz a operação 2(2-1)*2(2-2)
2*(1)*2*(2-2)
2*(1)*2*(0)
2*2*0
4*0
0
Aqui você errou. Não é "2*(2-1)*2*(2-2)", mas sim "
f1(2-1)
+2*
f1(2-2)", que resulta em f1(1)+2*f1(0) => 1+2*1 => 1+2 => 3.
Atribua 3
3*(3-1)*3(3-2)
3*(2)*3*(3-2)
3*(2)*3*(1)
6*3*1
18*1
18
Certo?
Errado. O certo para
n=3 seria o que segue.
f1(n-1)+2*f1(n-2) =
f1(3-1)+2*f1(3-2) =
f1(2)+2*f1(1) = # f1(2) foi calculado acima
3+2*1 =
3+2 =
5
O teste será facilitado se você usar o valor das rodadas anteriores para calcular a expressão das rodadas seguintes, à medida em que se for aumentando o valor do parâmetro. Não é o que vai acontecer na realidade: o computador não vai ter já guardados os valores de f1(4998) e f1(4999) quanto for chamado com f1(5000).
Na verdade, mesmo muito antes disso, a coisa já começa a ficar complicada. Veja o que o computador realmente executa quando você chama f1(5).
f1(5) =
f1(4) + 2*f1(3) =
(f1(3) + 2*f1(2) ) + 2*(f1(2) + 2*f1(1)) =
((f1(2) + 2*f1(1)) + 2*(f1(1)+2*f1(0))) + 2*((f1(1) + 2*f1(0)) + 2*1 ) =
(((f1(1)+2*f1(0)) + 2*1 ) + 2*(1 +2*1 )) + 2*((1 + 2*1 ) + 2 ) =
(((1 +2*1 ) + 2 ) + 2*(1 +2 )) + 2*((1 + 2 ) + 2 ) =
(((1 +2 ) + 2 ) + 2*3 ) + 2*(3 + 2 ) =
((3 + 2 ) + 6 ) + 2*5 =
(5 + 6 ) + 10 =
11 + 10 =
21
Ou seja: a chamada a
f1() com o parâmetro
5 se desdobrou em 14 chamadas internas recursivas. Se o parâmetro fosse
6, teriam sido 22 chamadas recursivas.
7 acarretaria 36 chamadas recursivas;
8, 58; e assim sucessivamente, sendo que a maior parte dessas chamadas é recalculando os mesmos valores de chamadas anteriores.
Mas eu acho que não é isso (i.e. análise de complexidade) o que se quer. O que mais importa, principalmente quando se tem recursão, é ter a certeza de que o algoritmo será finito.
No caso dele, ser finito tem um pré-requisito de domínio: o parâmetro não pode ser negativo.