Eliezer Reis:
A abordagem recursiva tende a ser mais rápida que a abordagem iterativa, porem, custa mais memória uma vez que precisa guardar o estado de cada chamada recursiva anterior, principalmente se a linguagem nao tem um esquema de, digamos, cache para isso.
Ué! Olha só a próxima pergunta da apostila:
apostila:
Por que o modo acima é extremamente mais lento para calcular a série do que o modo iterativo (que se usa um laço)?
Eu achava que era por isso: ao invés de fazer uma conta atrás da outra, o computador ficava fazendo dúzias de contas, uma quantidade que crescia exponencialmente, dependendo do valor de entrada, armazenava tudo na memória e ainda tinha que somar os resultados. Agora fiquei boiando.
Quanto ao método, eu tinha esquecido o que era um "laço". Estou acostumado a chamá-los de "loops". Valeu pelo toque.
Me desculpem por não ter encontrado os tópicos sobre o assunto. Pesquisei por "recursão", mas parece que a ferramenta de busca não é muito boa. Usei ela pra pesquisar sobre operador condicional ternário e não achei nada. A primeira resposta da google apontava pra esse fórum!
Bom, antes de olhar os links, meu código ficou:class Fibonacci{
int calculaFibonacci(int valor){
//0 1 1 2 3 5 8 13...
//0 1 1+0 1+1 2+1 3+2 5+3 8+5...
if (valor==0){
return 0;
}
if (valor== 1){
return 1;
}
Fibonacci i = new Fibonacci();
int a = i.calculaFibonacci(valor-1);
Fibonacci j=new Fibonacci();
int b = j.calculaFibonacci(valor-2);
return (a+b);
}
}o que funcionou, mas ficou feio. Depois de olhar os links e pesquisar, melhorou:class Fibonacci{
int calculaFibonacci(int valor){
//0 1 1 2 3 5 8 13...
//0 1 1+0 1+1 2+1 3+2 5+3 8+5...
Fibonacci i = new Fibonacci();
return( (valor<=1) ? valor : i.calculaFibonacci(valor-1)+i.calculaFibonacci(valor-2));
}
}Então, quanto à recursão, minha dúvida já foi resolvida.
Já que a questão sobre a velocidade foi levantada aqui, gostaria de uma explicação a respeito: afinal, qual método é mais rápido?
Muito obrigado a todos! Inclusive ao DaniloM, que fez a pergunta que o dyeimys linkou.