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.
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.
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=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>1){
var3 = (var1+var2);
var1=var2;
var2=var3;
//System.out.println(var3);
}
if(i<=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));
}
}
}