O que tem de errado neste código sobre série Fibonacci? RESOLVIDO

15 respostas
andre.nasc84

Bom dia pessoal, sou novo no guj e iniciante no mundo da programação e inclusive em Java! Estou tentando resolver este exercício “Imprima os primeiros números da série de Fibonacci até passar de 100. A série de Fibonacci é a seguinte: 0, 1, 1, 2, 3, 5, 8, 13, 21, etc… Para calculá-la, o primeiro e segundo elementos valem 1, daí por
diante, o n-ésimo elemento vale o (n-1)-ésimo elemento somando ao (n-2)-ésimo elemento (ex: 8 = 5 + 3)”. Consultei tópicos a respeito, vi sugestões meio avançada que não cheguei a ver ainda, uma vez que eu estou seguindo parte a parte da apostila Caelum FJ-11 (muito boa or sinal). Fiz o código, só apresenta erros e não estou conseguindo enxergar onde e como, pois a princípio quero utilizar o laço For somente e sem o lance de vetor e try, catch (não cheguei nessa parte ainda, e vi essa resolução nos tópicos e nao compreendi). veja, me dêm uma dica, por favor!

public classFibonacci { public static void main(String[] args) { int num1 = 1; int num2 = 1; int num3 = 0; for (int i = 0; i <= 100; i++){ if(i == 0 || i == 1){ num3 = (num1-1) + (num2 - 2); System.out.println(num3); } } } }
A resposta que me apresenta no console é:
-1
-1

Agradeço pela ajuda!

15 Respostas

B
public class Fibonacci {

    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 = 1; x < 15; x++) {   // Aqui pego apenas os 15 primeiros números da série

                int y = Fibonacci.calcular(x);
            
                System.out.println("\nSérie de Fibonacci: " + y);
		}
        
    }

}

Cara, acabei de testar aqui e tá normal.. ve se isso te ajuda ;)

D

como já tá o código aí em cima…

ccefetpb

No seu codigo vc não esta mudando os valores de num1 e num 2 dentro do for .
Esse é o erro se não funcionar o problema esta na sua logica.

renamed
Cara, o algoritmo acima é uma abordagem recursiva, que vc so aprendera mais para o futuro... considera esse aqui debaixo:
public class Fibo {  
    public static void main(String[] args) {  
    	escreveFibo(100);
    }
    
    public static void escreveFibo(int limite){
    	int atual = 1; //Número atual na sequência
    	int anterior = 0; //Número anterior
    	int proximoAtual; //Auxiliar, conterá a soma na hora da troca
    	
    	for(int i = 0; atual < 100; i++){
    		System.out.print(atual + ", ");
    		
    		proximoAtual = atual + anterior; //Calculando próximo atual
    		anterior = atual; //Fazendo que o atual vire o anterior
    		atual = proximoAtual; //Atual vira o próximo atual
    	}
    }
}

ok?

Tiberio

Só dando uma ajeitada no código do renamed:

Na parte:

for(int i = 0; atual < 100; i++)

Mude para:

for(int i = 0; atual < limite; i++)

Por que se não, a variável limite nunca vai ser útil nesse programa.

renamed
Obrigado Tiberio, eu tinha feito de uma forma, depois li que ele queria de outra e não mudei bem o código... segue o código novo! =)
public class Fibo {  
    public static void main(String[] args) {  
    	escreveFibo(100);
    }
    
    public static void escreveFibo(int limite){
    	int atual = 1; //Número atual na sequência
    	int anterior = 0; //Número anterior
    	int proximoAtual; //Auxiliar, conterá a soma na hora da troca
    	
    	while(atual < limite){
    		System.out.print(atual + ", ");
    		
    		proximoAtual = atual + anterior; //Calculando próximo atual
    		anterior = atual; //Fazendo que o atual vire o anterior
    		atual = proximoAtual; //Atual vira o próximo atual
    	}
    }
}
Nicolas_Fernandes
public class Fibonacci {    

    public static void main(String[] args) {    
        
        Scanner readLine = new Scanner(System.in);
        
        System.out.print("Digite a quantidade de valores da sequência deseja visualizar: "); 
        listarSequencia(Integer.parseInt(readLine.nextLine())); 
    }  
      
    public static void listaSequencia(int quantidadeValores){  
        
        int anterior = 1;
        int atual     = 0;


        for (int I = 0; I < quantidadeValores; ++I) {

            System.out.println(atual);
           
            atual     = atual + anterior;
            anterior = atual - anterior;
        }
    }  
}

Is this ;D

andre.nasc84

Boa tarde Pessoal!

Primeiramente muito obrigado a todos pela ajuda!
Eu consegui resolver…acredito eu rs… me deram uma dica de que eu deveria fazer primeiro um esboço para compreender a lógica! Depois que segui esses passos consegui chegar onde queria. Vejam… e concordam?

public class Fibonacci { public static void main(String[] args) { int num1 = 1; int num2 = 1; int num3 = 0; while (num3 <= 100) { num3 = num1 + num2; num1 = num2; num2 = num3; System.out.println(num3); } } }

No console apresentou o seguinte:
2 > 3 > 5 > 8 > 13 > 21 > 34 > 55 > 89 > 144

pablosaraiva

Quase certo. Mude apenas as seguintes linhas:

int num1 = 1;  
int num2 = 1;

para

int num1 = 0;  
int num2 = 1;

Pois o primeiro número da sequencia é 0.

andre.nasc84

Mas Pablosaraiva , no enunciado diz … Para calculá-la, o primeiro e segundo elementos valem 1, por isso que coloquei esses valores! Estou certo do que digo? Me corrija se eu estiver errado!

Valeu pela dica!

pablosaraiva

Seu professor deve estar equivocado.

Veja com seus próprios olhos: http://pt.wikipedia.org/wiki/Fibonacci

:slight_smile:

B

andre.nasc84:
Boa tarde Pessoal!

Primeiramente muito obrigado a todos pela ajuda!
Eu consegui resolver…acredito eu rs… me deram uma dica de que eu deveria fazer primeiro um esboço para compreender a lógica! Depois que segui esses passos consegui chegar onde queria. Vejam… e concordam?

public class Fibonacci { public static void main(String[] args) { int num1 = 1; int num2 = 1; int num3 = 0; while (num3 <= 100) { num3 = num1 + num2; num1 = num2; num2 = num3; System.out.println(num3); } } }

No console apresentou o seguinte:
2 > 3 > 5 > 8 > 13 > 21 > 34 > 55 > 89 > 144

Que eu saiba a sequencia de Fibonacci começa com 0.

seria mais ou menos asim:

public class Fibonacci {
	public static void main(String[] args) {
		int num1 = 0;
		int num2 = 1;
		int num3 = 0;
		while (num2 <= 100) {
			if (num1 == 0) {
				System.out.println(num1);
				System.out.println(num2);
				num3 = num1 + num2;
				num1 = num2;
				num2 = num3;
			} else {
				num3 = num1 + num2;
				num1 = num2;
				num2 = num3;
				System.out.println(num3);
			}
		}
	}
}

Acho que assim está certo. Não testei.

ViniGodoy

Seguindo a fórmula:

Função que calcula o n-ésimo termo da série de fibonatti:

public long fib(int n) { if (n == 0) return 0; if (n == 1) return 1; return fib(n-1) + fib(n-2); }

Ou, enxugando:

public long fib(int n) { return n == 0 || n == 1 ? n : fib(n-1) + fib(n-2); }

Pouquíssimo eficiente, mas muito simples:

for (int i = 0; i < 10; i++) { System.out.println(fib(i)); }

andre.nasc84

PabloSaraiva, se vc ver no enunciado que coloquei no primeiro post, eu teria que colocar o valor da variavel Num1 e Num 2 de 1. Seguindo de acordo com o que está escrito no enunciado, pelo que entendi, o código estaria certo né?! Por outro lado, em conceito teórico, a série começa pelo zero, isto é fato… tem razão no que diz! Confirma o que eu digo?
E mais uma para esclarecer de boa… o professor é a apostila da caelum que baixei rs…rs.)acho q houve erro de digitação então ou foi proposicional)… logo estou aprendendo na raça e sozinho, sem curso algum!rs… e agradeço a vc e a todos que participaram deste post, pois me ajudou a motivar ainda mais! Estou desenvolvendo a minha lógica e um dia atingirei o nivel em que poderei ajudar os novatos a resolverem problemas, o mesmo que vcs estão fazendo comigo… ajudando! Obrigado

Tiberio

Andre, aconselho fortemente que você ponha um [RESOLVIDO] após o nome do seu tópico, assim, as pessoas podem vir aqui sabendo que seu problema foi resolvido !

Abraços e bons estudos !

Criado 11 de novembro de 2009
Ultima resposta 11 de nov. de 2009
Respostas 15
Participantes 10