Fibonacci - Porque desse jeito não funciona?

4 respostas
G

Olá pessoal… sei que já existe muita informação neste fórum sobre Fibonacci, já achei o código que funciona corretamente, entretanto gostaria de saber porque o código abaixo NÃO funciona adequadamente.

public static void main(String args[]) {
 int n = 0;
        while(n<10){
            if(n == 0 || n == 1){
                int fibonacci = n;
                System.out.print(fibonacci+" ");
                n += 1;
            } else{
            int fibonacci = (n - 1) + (n - 2);
            System.out.print(fibonacci+" ");
            n += 1;
            }
        }
}

o código imprime >>> 0 1 1 3 5 7 9 11 13 15
o que está errado…

O código abaixo trabalha perfeitamente e imprime >>> 0 1 1 2 3 5 8 13 21 34

public  static int calcular(int  n) {

         if (n == 0 || n == 1)
             return n;
         else
             return calcular(n - 1) + calcular(n - 2);

     }

     public static void main(String[] args) {

         for (int x = 0; x < 10; x++) {   // Aqui pego apenas os 15 primeiros números da série

                 int y = Fibonacci.calcular(x);

                 System.out.print(y+" ");
         }

     }

Sei que estou comentendo um erro de lógica de programação mas eu não consigo ver
o problema do primeiro código! to cego! Me ajudem!
Obrigado!

4 Respostas

andeb

Não funcionou porque acho que você não entendeu o conceito de Fibonacci. A sequência de Fibonacci é composta pelo resultado anterior + o resultado anteanterior (inventei essa palavra agora…), ali você só tá fazendo - 1 e - 2. :stuck_out_tongue:
Daria certo se você armazenasse isso em um array…

Fiz isso aqui sem usa recursão, vê se ajuda hehe

public static void main(String[] args) {
        int n = 1;
        int old_1 = n;
        int old_2 = 0;
        for (int x = 0; x < 10; x++) {
            System.out.print(old_2 + " ");
            n = old_1 + old_2;
            old_2 = old_1;
            old_1 = n;
        }
    }
T

Olá, meu primeiro post aqui no GUJ, sou iniciante em JAva tambem, mas tentarei ajudar.

É o seguinte: a grande diferença entre o seu código e o que funciona é que :

Um funciona e outro não rssss...

Brincadeiras a parte, o código que funciona é recursivo entao, vou postr o código que funciona apenas pra poder explicar melhor:

public  static int calcular(int  n) {  
    
           if (n == 0 || n == 1)  
               return n;  
           else  
               return calcular(n - 1) + calcular(n - 2);  
    
       }  
    
       public static void main(String[] args) {  
    
           for (int x = 0; x < 10; x++) {   // Aqui pego apenas os 15 primeiros números da série  
    
                   int y = Fibonacci.calcular(x);  
    
                   System.out.print(y+" ");  
           }  
    
       }

Quando ele chama o método calcular(x) com x = 3 por exemplo, a função calcular em seu retorno chama ela mesma (recursividade - leia sobre pilhas tambem)
O que acontece é o seguinte a primeira chamada pra
calcular (3) realiza duas chamadas no return
calcular(2) + Calcular(1)

Calcular(2) retorna duas chamadas no return
Calcular(1) + Calcular(0)

NEsse ponto a pilha se encerra pois não existem mais chamadas a métodos... então ela é resolvida do fim para o começo.
Agora vamos avaliar:
Calcular(0) = 0
Calcular(1) = 1
Calcular(2) = Calcular(0) + Calcular(1) = 1
CAlcular(3) = calcular(2) + Calcular(1) = 2
CAlcular(4) = calcular(3) + Calcular(2) = 3 ....

E assim até o infinito ...

NO saso do seu programa voce não usou pilha, voce fez um incremento simples e quase reproduziu uma P.A rs

Espero ter ajudado, qualquer coisa posta mais ai que agente se ajuda!!!

Valew e boa sorte!!!

G
Tobarinha:
Olá, meu primeiro post aqui no GUJ, sou iniciante em JAva tambem, mas tentarei ajudar.

É o seguinte: a grande diferença entre o seu código e o que funciona é que :

Um funciona e outro não rssss...

Brincadeiras a parte, o código que funciona é recursivo entao, vou postr o código que funciona apenas pra poder explicar melhor:

public  static int calcular(int  n) {  
    
           if (n == 0 || n == 1)  
               return n;  
           else  
               return calcular(n - 1) + calcular(n - 2);  
    
       }  
    
       public static void main(String[] args) {  
    
           for (int x = 0; x < 10; x++) {   // Aqui pego apenas os 15 primeiros números da série  
    
                   int y = Fibonacci.calcular(x);  
    
                   System.out.print(y+" ");  
           }  
    
       }

Quando ele chama o método calcular(x) com x = 3 por exemplo, a função calcular em seu retorno chama ela mesma (recursividade - leia sobre pilhas tambem)
O que acontece é o seguinte a primeira chamada pra
calcular (3) realiza duas chamadas no return
calcular(2) + Calcular(1)

Calcular(2) retorna duas chamadas no return
Calcular(1) + Calcular(0)

NEsse ponto a pilha se encerra pois não existem mais chamadas a métodos... então ela é resolvida do fim para o começo.
Agora vamos avaliar:
Calcular(0) = 0
Calcular(1) = 1
Calcular(2) = Calcular(0) + Calcular(1) = 1
CAlcular(3) = calcular(2) + Calcular(1) = 2
CAlcular(4) = calcular(3) + Calcular(2) = 3 ....

E assim até o infinito ...

NO saso do seu programa voce não usou pilha, voce fez um incremento simples e quase reproduziu uma P.A rs

Espero ter ajudado, qualquer coisa posta mais ai que agente se ajuda!!!

Valew e boa sorte!!!

O que é P.A. ??

ellison

Opa meu camarada.
Devido a sua dúvida com o fibonacci eu implemente esse algoritmo aqui sem utilizar recursividade. Fica mais fácil entender como funciona:

public static void main(String[] args) {
	System.out.println("Fibonnaci sem recursividade");
	System.out.println(fibonnaciSequence(10));		// 10 é o número de iterações que serão executadas
}

private static String fibonnaciSequence(int totalIteracoes) {
		int[] arrFib = new int[totalIteracoes];
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < totalIteracoes; i++) {
			if (i == 0 || i == 1) {
				arrFib[i] = i;
			} else {
				arrFib[i] = arrFib[i - 1] + arrFib[i - 2];
			}
			sb.append(arrFib[i]).append(" ");
		}
		return sb.toString();
	}

Espero ter ajudado. Abraço.

Progressão Aritmética = )
Você define uma sequencia (Ex.: 1, 2, 3, 4, 5) P.A de Razão 1. Ou seja, você define um intervalo e vai incrementando ele.
Se fosse uma P.A de razão 3 o Exemplo seria: 1, 4, 7, 10, 13 … etc

Criado 8 de março de 2010
Ultima resposta 9 de mar. de 2010
Respostas 4
Participantes 4