[quote=sowyer][quote=rafaelczy][quote=fernandosavio]A recursividade é mais custosa em termos de processamento. Pois o Sistema Operacional aloca espaço para uma função Fibonacci e ela chama ela mesmo, então essa primeira instância fica na memória e o sistema operacional empilha outra instância do método na memória, e aí ele chama ele de novo e cria outra instância… e por aí vai! A última instância retornará a resposta requisitada e retornará para a instância que a chamou até chegar na primeira instância do método que retornará para o usuário a resposta desejada…
Resumo: O SO empilha os métodos recursivos até que algum deles retorne e desempilha tudo.
Então a recursividade gasta mais porque cria várias instâncias do mesmo método até que ele se resolva.
Espero não ter complicado muito![/quote]
Logo, se eu desejo criar uma aplicação leve e rápida pra uma plataforma com pouca mem RAM e pouca vel de processador, o negócio é evitar recursividade. certo?[/quote]
Exato ! :thumbup: [/quote]
Então qdo q recursividade é uma escolha ideal de código, se ela gasta mais memoria e processador?
Pessoal ! agora to me matando pra gerar a serie fibonacci com array + recusividade!
Pensei q eu tava safo mas me fu… de novo hehehe!
bom olhem ai o meu main:
class fibonacciArrayRecursivo{
public static void main(String[] args){
gera teste = new gera();
gera.calcula(2);
}
}
e aqui minha querida classezinha:
class gera{
int[] fibonacci = new int[20];
fibonacci[0] = 0;
fibonacci[1] = 1;
System.out.print(this.fibonacci[0]); // aqui ja matou os dois primeiros nums da serie
System.out.print(this.fibonacci[1]);
int calcula(int i){ // aqui passa como parametro 2 que é a terceira casa do array
while (i < 20){ // condição pra parar qdo chegar na ultima posição do vetor
this.fibonacci[i] = this.fibonacci[i - 1] + this.fibonacci[i - 2]; // logica é posição 3 = posição 2 + posição 1
i = i + 1; // incremento da posição
return this.calcula[i]; // chama de novo o metodo mas dessa vez pede pra calcular o valor contido na prox posição
}
}
}
[quote=sowyer]rapz!.. vc chama o calcula e não passa o parâmetro ?? pq ?
[/quote]
eu achei que nao precisava pois ao chamar calcula ele volta na linha 9 e encontra o parametro “i”. Quer dizer que na linha 13 tenho de passar o parametro “i” ?
public static void main(String args[]){
System.out.println(fibonacci(8, 0, 1));
}
public static int fibonacci(int limite, int a, int b){ //Limite=enésimo elemento da sequência
return (limite>1) ? fibonacci(limite-1, b, a+b) : a ;
}
[quote=fernandosavio][code]public class MainTeste {
public static void main(String args[]){
System.out.println(fibonacci(8, 0, 1));
}
public static int fibonacci(int limite, int a, int b){ //Limite=enésimo elemento da sequência
return (limite>1) ? fibonacci(limite-1, b, a+b) : a ;
}
}[/code][/quote]
Fernando eu tenho q resolver esse usando array+recursividade.
se puder ajeitar meu codigo fica mais facil pra mim entender pq a logica é minha
valeu
Repense seu código…
Não existe recursividade que tenha algum nexo que retorne void…
Ela tem que retornar algo para o método anterior na pilha poder trabalhar com ele…
[quote=fernandosavio]Repense seu código…
Não existe recursividade que tenha algum nexo que retorne void…
Ela tem que retornar algo para o método anterior na pilha poder trabalhar com ele…[/quote]
eu tb achei isso mas mudei o metodo pra void pq antes o metodo era int e eu nao conseguia compilar.
Ja tentei com int o metodo e ja nao sei mais o que fazer.
pode dar alguma pista?
Fernando acho q to chegando la.
eu estava cometendo o erro fazer operações de atribuição e comandos imprimir dentro da classe gera. Agora criei um metodo contrutor gera onde coloquei esses comandos e só ta dando 1 erro dos 37 que davam antes:
class gera{
int[] fibonacci = new int[20];
gera(){
fibonacci[0] = 0;
fibonacci[1] = 1;
System.out.print(this.fibonacci[0]);
System.out.print(this.fibonacci[1]);
}
int calcula(int i){
while (i < 20){
this.fibonacci[i] = this.fibonacci[i - 1] + this.fibonacci[i - 2];
i = i + 1;
calcula(i);
}
}
}
o main
[code]
class fibonacciArrayRecursivo{
public static void main(String[] args){
gera teste = new gera();
gera.calcula(2);
}
}[/code]
da um erro de “non=static method calcula(int) cannot be refered from a static context”
gera.calcula(2);
^nao entedi esse erro cara
class gera{
int[] fibonacci = new int[20];
gera(){
fibonacci[0] = 0;
fibonacci[1] = 1;
System.out.print(this.fibonacci[0]); //foi dito que aqui nao executa nada
System.out.print(this.fibonacci[1]); // e nem aqui !!! onde ponho isso entao? E pq isso é assim?
}
void calcula(int i){
while (i < 20){
this.fibonacci[i] = this.fibonacci[i - 1] + this.fibonacci[i - 2];
i = i + 1;
calcula(i);
}
}
}
[quote=rafaelczy]porem me falaram que:
compila mas-
[code]
class gera{
int[] fibonacci = new int[20];
gera(){
fibonacci[0] = 0;
fibonacci[1] = 1;
System.out.print(this.fibonacci[0]); //foi dito que aqui nao executa nada
System.out.print(this.fibonacci[1]); // e nem aqui !!! onde ponho isso entao? E pq isso é assim?
}
void calcula(int i){
while (i < 20){
this.fibonacci[i] = this.fibonacci[i - 1] + this.fibonacci[i - 2];
i = i + 1;
calcula(i);
}
}
}
[/code][/quote]
me disseram q meus comandos print nao executam dentro metodo construtor gera(){} - Pq e como devo fazer ?
Fernando, o que sao conceitos OO ?