Metodo - recursivo

Olá pessoal, alguem podería me ajudar?

Preciso de alguma informação sobre RECURSÃO ou seja um método que chama ele mesmo?

Sds.

Julio.

http://www.google.com.br/search?hl=pt-BR&q=%22M%C3%A9todo+recursivo%22&meta=

Que tipo de informação?
Você mesmo já definiu o que é um método recursivo…

Na verdade, estou fazendo um curso por apostila e tem um exercício que pede para usar o metodo recursivo para apresentar um numero da sequência Fibonacci.

A idéia é:
Criar uma classe (Fibonacci) para ser usada da seguinte maneira:

Fibonacci fibo = new Fibonacci();
int i = fibo.calculaFibonacci(5);
System.out.println(i);

Nesse caso o quinto numero da sequência Fibonacci é 8.

Desde já o meu muito obrigado pelo interesse.

Julio.

Não fiz com classe,mas funciona assim:

public class fibonacci{
   public static long calcula(long TermoN,long A, long B) {
       if(TermoN == 0) {
         return A+B;
       } else {
         return calcula(TermoN-1,B,A+B);
        }
   }
 
      public static void main (String args[]){
        long NumeroTermo = 10;
        long T0 = 1;
        long T1 = 1;

        if (NumeroTermo == 1 || NumeroTermo ==0) {
          System.out.println(1);
        } else {
          System.out.println(calcula(NumeroTermo-2,T0,T1));
        }
      }

Estou considerando que vc comeca a contar do zero.O NumeroTermo-2 é pra contar a partir do restante da serie (vc ja tem os dois primeiros termos).Quando TermoN chega em zero,vc já está calculando o termo que vc quer,por isso so o return A+B.

cara,desculpa postar no teu topico,mas já que o assunto é o mesmo:

	private void parseVariveis(int indiceCelula , int IV , String Expressao) {


		if(IV >= Celula[indiceCelula].getIndiceDeVizinhos().length) {

			return;

		} else {

			int Temp = Celula[indiceCelula].getIndiceDeVizinhos()[IV];

			Expressao = Expressao + Celula[Temp].getBinario() + ";";

			parseVariaveis(indiceCelula,IV+1,Expressao);

		}

	}

Mensagem:The method parseVariaveis (int,int,String) is undefined for the type Tabela. Pergunta tosca: como assim ‘não está definido’?

(caso alguem pergunte:isso dai é de um programinha inutil de mapa de karnaugh.tava sem fazer nada e resolvi mexer um pouco.)

Muito obrigado Isis, valeu mesmo.

Mas nesse exercício tenho que treinar a recursividade de metodos e é pedido para ser feito com classe e método.

De qualquer forma é bem valiosa a sua ajuda pois tem uma resolução diferente da minha.

Sds.

Julio.

Basta prestar atenção na regra que define a seqüência matemática:

Fonte: Wikipedia

Então sua função recursiva será

[code]public int fib(int n) {
if (n == 0)
return 0;
if (n == 1)
return 1;

return fib(n-1) + fib(n-2);
}[/code]

Valeu Vini.

É isso mesmo. . .

Julio.

Mas nesse exercício tenho que treinar a recursividade de metodos e é pedido para ser feito com classe e método.

sim sim.só te coloquei o algoritmo.

Vinicius,eu não gosto muito dessa forma de resolver o problema (return fib(x-1) + fib(x-2)) .Dá uma olhada (estou fazendo de acordo com a ordem de chamada de ‘funcao’):

fib(2) => fib(1) + fib(0) = 1 + fib(0) = 1+1

fib(3) => fib(2) + fib(1) = fib(1) + fib(0) + fib(1) = 1 + fib(0) + fib(1) = 1 + 1 + fib(1) = 1+1+1

fib(4) => fib(3) + fib(2) = fib(2)+fib(1) + fib(2) = fib(1)+fib(0) +fib(1)+fib(2) = 1+fib(0) +fib(1)+fib(2) = 1+1 +fib(1)+fib(2) = 1+1 +1+fib(2) = 1+1 +1+fib(1) + fib(0) = 1+1+1+1+fib(0) = 1+1+1+1+1

Ou seja: vc deixa de somar os anteriores p/ somar um monte de 1’s umas trocentas vezes*.

Não sei como se mede tempo de execucao de um modo certo,mas fiz um treco rapidamente aqui (mudei pra double o retorno) pra saber qto tempo eu esperei

N=42 :: 0 segundos
N=42 :: 10.67200 segundos (1+1+1+…)

N=126 :: 0,016 segundos
N=126 :: ainda estou esperando (1+1+1+…)

*Basicamente com o amontoado de 1’s vc diz que não sabe do que são formados os numeros entre T(1) (vc passa o indice do termo e não ele propriamente dito).Mas como,por definição,a sequencia comeca em 1 e 1,esses dois numeros estao corretos e a soma deles tmb está (desde que a logica da implementacao esteja certa,obvio),então nao tem sentido ficar desmontando em pedacinhos.

Oi isis, isso que você falou é bem pertinente. E pode ser resolvido com um cache:

[code]
public class Fibonacci {
private Map<Integer, Long> cache = new HashMap<Integer, Long>();

public long fib(int i) {
if (i == 0)
return 0;
if (i == 1)
return 1;
Long num = cache.get(i);
if (num != null)
return num;

  long f = fib(i-1) + fib(i-2);
  cache.put(f);
  return f;

}
}[/code]

Note que agora a execução de fib(i-2) não tem custo praticamente nenhum.

E calculos de diferentes sequências no mesmo objeto dessa classe ficarão progressivamente mais rápidos, uma vez que mais e mais números entrarão para o cache.

Mas aí existe um trade-off. O cache pode agilizar bastante as coisas, mas consome memória.

[quote=ViniGodoy]Basta prestar atenção na regra que define a seqüência matemática:

Fonte: Wikipedia

Então sua função recursiva será

[code]public int fib(int n) {
if (n == 0)
return 0;
if (n == 1)
return 1;

return fib(n-1) + fib(n-2);
}[/code]

[/quote]

eu não consegui fazer, tentei rodar esse código e naum funfa…

pode ser interessante:

http://logbr.reflectivesurface.com/2008/02/01/conceitos-de-programacao-tail-recursion/

Olá pec!

Muito interessante!

Problema resolvido, muito obrigado!

Aqui vai a resposta do exercício em questão… eu também estou conhecendo o Java pela apostila Caelum…

abraços

class ExercicioClassFibo{

int var1;
int var2;
int var3;

	void fibo(int var, int i){
				
			if(i==0){
			var1 = 0;
			//System.out.println(var1);
			}
			if(i==1){
			var2 = 1;
			//System.out.println(var2);
			}
			if(i&gt;1){
			var3 = (var1+var2);
			var1=var2;
			var2=var3;
			//System.out.println(var3);
			}
			if(i&lt;=var){
			fibo(var,++i);
			}
	}

}

class FNfibonacci{
public static void main(String[] args){
ExercicioClassFibo NewFibo;
NewFibo = new ExercicioClassFibo();
NewFibo.fibo(5,0);
System.out.println(NewFibo.var3);

}

}

public class Exerciciofibo {
	static long fibo(int n) {
		if (n < 2) {
			return n;
		} else {
			return fibo(n - 1) + fibo(n - 2);
		}
	}

	public static void main(String[] args) {
		for (int i = 0; i < 30; i++) {
			
			System.out.println(Exerciciofibo.fibo(i));
		
		}
	}
}