Método recursivo com operador condicional ternário. (Fibonacci)

14 respostas
Neviat

[color=red]Desculpa, dois tópicos, mas quando estava enviando o primeiro, parei o carregamento da página para mudar o título, mas não sabia que tinha enviado mesmo assim, então mudei o título e enviei (então novamente). Não achei onde poderia excluir o tópico.[/color]

O exercício da apostila pedia que eu fizesse o método recursivo calculaFibonacci, mas estou achando que o que fiz ta muito enrolado, apesar de funcionar, acredito que esteja muito grande e há alguma outra forma mais simples de escrever isso, até porque o exercício posterior pede que eu reescreva o método recursivo usando apenas uma linha (usando o operador condicional ternário). Não da pra escrever tudo isso é uma linha com o ternary operator!!

Se liga no tamanho:

class Fibonacci {
	int a;
	int b;
	int calculaFibonacci(int ordem) {
		int atual = 0;
		int resultado;
		a = 0;
		resultado = a;
		if (atual < ordem) {
			b = 1;
			resultado = b;
			atual++;
			while (atual < ordem) {
				if (atual < ordem) {
					a = a + b;
					resultado = a;
					atual++; }
				if (atual < ordem) {
					b = a + b;
					resultado = b;
					atual++; } }
			return resultado; }
		else {
			return resultado; } } }
class ProgramaFibonacci {
	public static void main(String args[]) {
		Fibonacci fibo = new Fibonacci();
		int wanted = 0;
		while (wanted < 10) {
			int i = fibo.calculaFibonacci(wanted);
			System.out.println(i);
			wanted++; } } }

Isso tudo pra calcular a teoria de Fibonacci podendo chegar a certo resultado pela ordem dele.
Então como seria o código simples? Como eu poderia usar o operador condicional ternário?

Agradeço a quem poder ajudar… :smiley:

14 Respostas

Neviat

Consegui simplificar um pouco:

class Fibonacci {
	int a;
	int b;
	int calculaFibonacci(int ordem) {
		int atual = 0;
		int resultado;
		a = 0;
		resultado = a;
		ordem--;
		if (ordem >= 0) {
			b = 1;
			resultado = b;
			ordem--;
			while (ordem >= 0) {
				if (ordem >= 0) {
					a = a + b;
					resultado = a;
					ordem--; }
				if (ordem >= 0) {
					b = a + b;
					resultado = b;
					ordem--; } }
			return resultado; }
		else {
			return resultado; } } }
class ProgramaFibonacci {
	public static void main(String args[]) {
		Fibonacci fibo = new Fibonacci();
		int wanted = 0;
		while (wanted < 10) {
			int i = fibo.calculaFibonacci(wanted);
			System.out.println(i);
			wanted++; } } }
d34d_d3v1l

Me explica isto:

while (ordem >= 0) {  
                if (ordem >= 0) {  
                    a = a + b;  
                    resultado = a;  
                    ordem--; }  
                if (ordem >= 0) {  
                    b = a + b;  
                    resultado = b;  
                    ordem--; } 
}

Me explique a necessidade desses dois ifs.
Precisaria só de um, não?

G
int calculaFibonacci(int ordem) {  
    	int atual = 0;  
        int anterior = 1;  
        int c;  
        
        while (ordem > 0) {
        	c = atual;
        	atual += anterior;
        	anterior = c;
        	ordem--;
        }  
        return atual;
    }
Neviat

d34d_d3v1l:
Me explica isto:

while (ordem >= 0) {  
                if (ordem >= 0) {  
                    a = a + b;  
                    resultado = a;  
                    ordem--; }  
                if (ordem >= 0) {  
                    b = a + b;  
                    resultado = b;  
                    ordem--; } 
}

Me explique a necessidade desses dois ifs.
Precisaria só de um, não?

Dois porque um calcula o a e o outro o b. Se eu colocasse tudo em um só if, teria que ter dois ordem– e dois resultados diferentes dentro do mesmo if. Teria problema no return depois do if.
Não?

Neviat
GilsonNunes:
int calculaFibonacci(int ordem) {  
    	int atual = 0;  
        int anterior = 1;  
        int c;  
        
        while (ordem > 0) {
        	c = atual;
        	atual += anterior;
        	anterior = c;
        	ordem--;
        }  
        return atual;
    }

Onde está o cálculo da serie de Fibonacci?

d34d_d3v1l

Neviat:

Dois porque um calcula o a e o outro o b. Se eu colocasse tudo em um só if, teria que ter dois ordem– e dois resultados diferentes dentro do mesmo if. Teria problema no return depois do if.
Não?

Não. vc reparou que dentro dos ifs e do while, tem a mesma condição? Isto não te diz nada não?

G
Neviat:
GilsonNunes:
int calculaFibonacci(int ordem) {  
    	int atual = 0;  
        int anterior = 1;  
        int c;  
        
        while (ordem > 0) {
        	c = atual;
        	atual += anterior;
        	anterior = c;
        	ordem--;
        }  
        return atual;
    }

Onde está o cálculo da serie de Fibonacci?

não sei. nem me atentei a saber.

só me preocupei em fazer um código q fazia o mesmo q o seu.
e isso foi feito. teste ai pra vc ver.

Neviat

d34d_d3v1l:
Neviat:

Dois porque um calcula o a e o outro o b. Se eu colocasse tudo em um só if, teria que ter dois ordem– e dois resultados diferentes dentro do mesmo if. Teria problema no return depois do if.
Não?

Não. vc reparou que dentro dos ifs e do while, tem a mesma condição? Isto não te diz nada não?

Não consegui perceber ainda o que vc encontrou =/
Eu coloquei um while com as mesmas condições de if porque eu queria que o if se repetisse enquanto aquelas condições fossem verdadeiras, para isso eu teria que fazer um while.
Como você escreveria isso? Não entendi bem… :shock:

Neviat

GilsonNunes:
Neviat:

Onde está o cálculo da serie de Fibonacci?

não sei. nem me atentei a saber.

só me preocupei em fazer um código q fazia o mesmo q o seu.
e isso foi feito. teste ai pra vc ver.

:shock: Seu código faz o mesmo que o meu!
Vou ter que revisar seu código algumas vezes para entender, estou um pouco lento ainda.
vlw! :smiley:

ViniGodoy

Por favor, ao postar tópicos, evite pedir "Ajuda!!" ou dizer que é "Dúvida!!" no título. É uma informação totalmente inútil, afinal, se vc não precisasse de ajuda, nem teria aberto o tópico.

Além disso, procure usar a busca do fórum. Esse exercício já foi resolvido diversas vezes aqui. Por exemplo:
http://www.guj.com.br/java/57712-metodo----recursivo#303559

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

[img]http://upload.wikimedia.org/math/0/d/5/0d5cce25d67941bb4661afd52609d93c.png[/img]

Fonte: Wikipedia

Então sua função recursiva será
public int fib(int n) {
   if (n == 0)
      return 0;
   if (n == 1)
      return 1;

   return fib(n-1) + fib(n-2);
}

ViniGodoy

PS: Se fizer questão de usar o ternário:

public int fib(int n) { return n &lt; 2 ? n : fib(n-1) + fib(n-2); }

ruivo
ViniGodoy:
Por favor, ao postar tópicos, evite pedir "Ajuda!!" ou dizer que é "Dúvida!!" no título. É uma informação totalmente inútil, afinal, se vc não precisasse de ajuda, nem teria aberto o tópico.

Além disso, procure usar a busca do fórum. Esse exercício já foi resolvido diversas vezes aqui. Por exemplo:
http://www.guj.com.br/java/57712-metodo----recursivo#303559

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

[img]http://upload.wikimedia.org/math/0/d/5/0d5cce25d67941bb4661afd52609d93c.png[/img]

Fonte: Wikipedia

Então sua função recursiva será
public int fib(int n) {
   if (n == 0)
      return 0;
   if (n == 1)
      return 1;

   return fib(n-1) + fib(n-2);
}

É por essas e outras que cada dia eu perco um pouquinho da minha fé na computação. Quando eu digo que as pessoas tem que aprender CONCEITOS e não linguagens e frameworks, galera fica brava. Não que saber resolver Fibonacci em uma linha te torne automaticamente num excelente programador, mas não saber com certeza mostra que a pessoa não está preparada para essa área.

Na minha concepção, antes de querer aprender java, o cara tinha que pegar aquele livro de algoritmos estruturados, do Harry Farrer, e comer ele inteiro com farinha e rapadura. Depois que aprendeu a escrever ALGORITMOS, aí sim a pessoa poderia começar a querer programar.

Neviat

ViniGodoy:
PS: Se fizer questão de usar o ternário:

public int fib(int n) { return n &lt; 2 ? n : fib(n-1) + fib(n-2); }

Obrigado!!

Neviat

ruivo:
É por essas e outras que cada dia eu perco um pouquinho da minha fé na computação. Quando eu digo que as pessoas tem que aprender CONCEITOS e não linguagens e frameworks, galera fica brava. Não que saber resolver Fibonacci em uma linha te torne automaticamente num excelente programador, mas não saber com certeza mostra que a pessoa não está preparada para essa área.

Na minha concepção, antes de querer aprender java, o cara tinha que pegar aquele livro de algoritmos estruturados, do Harry Farrer, e comer ele inteiro com farinha e rapadura. Depois que aprendeu a escrever ALGORITMOS, aí sim a pessoa poderia começar a querer programar.

A apostila com que eu estava aprendendo java ensinava quase que diretamente a linguagem (era a da CAELUM).
Agora baixei o livro Java - Como Programar, da Deitel, e estou começando tudo de novo, aprendendo conceitos…
O livro é suficiente?

Criado 9 de julho de 2012
Ultima resposta 10 de jul. de 2012
Respostas 14
Participantes 5