Aprendendo recursividade

Bom pessoal, estou tentando criar um código pra aprender recursividade ao gerar a série Fibonacci:
0 1 1 2 3 5 8 13…
Mas está dando um problema de “missing return statement” na linha 14. Não consegui entender pq.

class Fibonacci { int a=0; int b=1; int i; int calcula(int num){ if (num <= 6){ System.out.print(this.a + " , "); System.out.print(this.b + " , "); this.a = this.a + this.b; this.b = this.b + this.a; this.i = this.i + 1; return calcula(num - 1); } else { System.out.println("Fim");} } }

abaixo o main

[code]class GeraSerie {
public static void main(String[] args){

	Fibonacci fibo = new Fibonacci();
	
	int i = fibo.calcula(6);
	System.out.print(i);	
}

}[/code]

agradecido desde já

Olá rafaelczy!
O erro está acontecendo porque sempre que um método declara que vai retornar algum valor ele é obrigado a retornar algo em todas as possibilidades de fluxo do algoritmo…
Resumindo a ópera: Se a condição do if for verdadeira o método retorna calcula(num-1)… Mas e se for falsa??? Seu código não retorna nada, e é isso que está impedindo seu código de ser compilado.
Espero ter ajudado!

[quote=fernandosavio]Olá rafaelczy!
O erro está acontecendo porque sempre que um método declara que vai retornar algum valor ele é obrigado a retornar algo em todas as possibilidades de fluxo do algoritmo…
Resumindo a ópera: Se a condição do if for verdadeira o método retorna calcula(num-1)… Mas e se for falsa??? Seu código não retorna nada, e é isso que está impedindo seu código de ser compilado.
Espero ter ajudado![/quote]

Oi Fernando!
thanks men!
Essa teoria eu entendi mas nao exatamente como representar o tal retorno que falta no código não.
Sempre que num <= 6 vai chamar calcula(num) e quando nao for mais eu pus um “ELSE” seguido de um System.out.print(“Fim”); Eu achei que esse seria um retorno adequado.
Pode me ajudar dando um exemplo do retorno que eu deveria colocar escrito no codigo?
valeu

retorna um 0 aí =)

Bom dia,

Cara, o retorno do seu método é um int, e no else você apenas escreve "Fim!" no console.
E isto não é considerado um retorno de método. Esse retorno é void.

Da uma analisada direitinho. Lembrando que o algoritmo de fibonacci é:

fibonacci(i) =
0, se i = 0
1, se i = 1
fibonacci(i-1) + fibonacci(i-2), se i >=2

É só transformar num método.
Abs,

Consegui galera:

class Fibonacci {
	int a=0;
	int b=1;
	int calcula(int num){
		int x = num;
		if (x <= num && x >= 1){
			System.out.print(this.a + " , ");	
			System.out.print(this.b + " , ");
			this.a = this.a + this.b;
			this.b = this.b + this.a;
			return calcula(x-1);
		}
 		else {
			System.out.println(" ");
			System.out.println("Fim");
			return 0;
		}
	}
}

Bom agora cumpri o que pede: gerar a serie usando recursividade. o exercício tb pede pra depois gerar a serie mas usando só uma linha de codigo (usando operador ternario)
Alguem pode postar um código de exemplo pro problema em questao ai galera?
Outra coisa: Tem um jeito de eu dar o retorno pedido no metodo calcula(num) sem imprimir zero como ta sendo o caso ai em cima?
valeu

Para entender o operador ternário, vou te dar um exemplo que faz a mesma coisa com o if.

if(i&lt;=0){
    fatorial = 0;
}else{
    fatorial = i*fatorial(i-1);
}
return fatorial;

//Operador ternário
fatorial = (i &lt;= 0) ? 0 : i*fatorial(i-1);

Basta adaptar.

Abs,

[quote=henriqueluz]Para entender o operador ternário, vou te dar um exemplo que faz a mesma coisa com o if.

if(i&lt;=0){
    fatorial = 0;
}else{
    fatorial = i*fatorial(i-1);
}
return fatorial;

//Operador ternário
fatorial = (i &lt;= 0) ? 0 : i*fatorial(i-1);

Basta adaptar.

Abs,[/quote]

fatorial = (i &lt;= 0) ? 0 : i*fatorial(i-1); // Não entendi o "(i &lt;= 0)" , o "?" e o ":" - como se lê essa linha de código?

valeu

opss… a primeira expressao entre aspas que eu citei informei erradamente que nao entendi - mas só nao entendi mesmo o “?” e o “:”

Cara o “?” é o operador ternário.
E o que vem após ele é o que deve ser retornado e atribuido.
(condição) ? SE CONDIÇÃO FOR VERDADE RETORNA AQUI : SE FOR FALSA RETORNA AQUI

entendeu?

[quote=henriqueluz]Cara o “?” é o operador ternário.
E o que vem após ele é o que deve ser retornado e atribuido.
(condição) ? SE CONDIÇÃO FOR VERDADE RETORNA AQUI : SE FOR FALSA RETORNA AQUI

entendeu?[/quote]

Sim cara, com esso ultimo exemplo entendi. legal tua leitura, simples de entender.
Agora vou tentar adptar com o operador ternário pra ver se consigo gerar a serie fibonacci numa linha só.
thank’s men!
i talk in english but my love is Brasil

Bom, to tentado agora gerar a serie Fibonacci com o operador ternário mas ta dando erro de “unexpected type” bem em cima do “?” que no caso é o operador ternário, ou seja, nao escrevi direito a expressão e ele nao ta reconhcendo.

class Fibonacci {
	int calcula(int a, int b){
		(a==0 && b==1) ? a , b : a=a+b && b=b+a; calcula(a,b);	
	}
}
class GeraSerie {
	public static void main(String[] args){
		
		Fibonacci fibo = new Fibonacci();
		
		int i = fibo.calcula(0, 1);
		System.out.print(i);	
	}
}

O que eu queria executar na linha do op. ternario seria: pra ele retornar 0 e 1 (na primeira chamada )e nas chamadas posteriores(recursivas) da função imprimir A valendo A+B e B valendo B+A

ta por ai ainda henrique?

Eix a funçaão Recursiva para calculo da serie de fibonacci

public static int fib(int i){ if (i==1 ||i==2) return 1; else return (fib(i-1)+fib(i-2)); }

Cara…
O operador ternário não pode ser usado a qualquer momento…
Eis a explicação:
(Condição) ? O QUE RETORNARÁ SE TRUE : O QUE RETORNARÁ SE FALSE ;

Se você fizer isso:

(a>b)?"a é maior que b" : "a é menor ou igual a b";

Você jogará fora o retorno do condicional ternário.
Se você atribuir esse retorno a alguma variável o compilador permitirá que o código compile:

String retorno = (a>b)?"a é maior que b" : "a é menor ou igual a b";
//Ou ainda
return (a>b)?"a é maior que b" : "a é menor ou igual a b";

Entendeu?

[quote=fernandosavio]Cara…
O operador ternário não pode ser usado a qualquer momento…
Eis a explicação:
(Condição) ? O QUE RETORNARÁ SE TRUE : O QUE RETORNARÁ SE FALSE ;

Se você fizer isso:

(a>b)?"a é maior que b" : "a é menor ou igual a b";

Você jogará fora o retorno do condicional ternário.
Se você atribuir esse retorno a alguma variável o compilador permitirá que o código compile:

String retorno = (a>b)?"a é maior que b" : "a é menor ou igual a b";
//Ou ainda
return (a>b)?"a é maior que b" : "a é menor ou igual a b";

Entendeu?[/quote]

Sim
Mas olha só meu código abaixo, eu tenho duas variaveis A e B dentro da condição e quero que retorne um valor para cada variável a depender se A==0 e B==1.
Com o Return q vc sugeriu dá “unexpected type” no op ternario. E armazenar A e B numa variavel? É possível? E depois complicou mais ainda pq quero que tanto na opção FALSE do op ternario qto na opção TRUE dele execute mais de uma orientação e to perdidão na sintaxe

Fibonacci { int calcula(int a, int b){ return (a==0 && b==1) ? a , b a=a+b && b=b+a calcula(a,b): a=a+b && b=b+a; calcula(a,b); /* como A e B começam com 0 e 1 então retorna e imprime 0 e 1 (os dois primeiros numeros da serie fibonacci). Não to conseguindo isso e além disso ainda teria outra orientação que após retornar 0 e 1 faria a operação de soma das variaveis A e B, dai chamaria de novo a função. Dai A valendo 1 e B valeno 2 ao entrar na interrogação da condição (a==0 && b==1) novamente darial FALSO e em todas chamadas posteriores tb, e a partir de entao sempre somando e atualizando A e B e imprimindo as duas e rechamando a função. Fiz uma salada ai no codigo pra poder me fazer entender */ }

abaixo o main

[code]class GeraSerie {
public static void main(String[] args){

	Fibonacci fibo = new Fibonacci();
	
	int i = fibo.calcula(0, 1);
	System.out.print(i);	
}

}[/code]

valeu

Teu código está meio confuso…
Mas vamos lá.
Não é possível retornar duas variáveis, nem com operador ternário nem com nada. Porém é possível retornar um array com dois valores!

Não sei se seus conceitos de recursão estão bem estudados, mas vou mandar um exemplo que fiz agora de Fibonacci com recursão para você ver.

	public static void main(String args[]) {
		int elem1 = 0;	//Primeiro elemento Fibonacci
		int elem2 = 1;	//Segundo elemento Fibonacci

		//Chama o método recursivo
		calculaFibonacci(elem1,elem2);
	}

	static int calculaFibonacci(int a, int b){

		if(b>500){		//O número 500 é o critério de parada da recursão
			return 0;	//Aqui simplesmente encerra com a recursão, não nenhum efeito relevante nos cálculos
		}else{
			System.out.println(a);	//Imprime no console o elemento atual
			return calculaFibonacci(b, a+b);	//Chama recursivamente o cálculo dos próximos elementos
		}
	}

Voces estão a aplicar recursividade nessas Soluções?

sim ruben_m…
Estamos tentando ajudar o companheiro a aprender recursividade usando como exemplo Fibonacci…

Engraçado
Na apostila da caelum no fim do cap 4 - seção 4.13 pede pra resolver a serie fibonacci com recursividade e op. ternario em apenas uma linha.
Se eles pedem isso é pq é possível mas como se eu não posso ter duas variaveis dentro da condição e muito menos dar mais de uma instrução no caso FALSE e no caso TRUE

class Fibonacci {
	int calcula(int a, int b){
                return (se A vale 0 e B vale 1) ? IMPRIME a , b apos isso INCREMENTA a . b e CHAMA calcula(a,b) de novo : SE NAO ENTAO IMPRIME  a=a+b && b=b+a e CHAMA calcula(a,b) de novo; // se isso fosse possível resolveria o problema mas se nao é então como resolver com recursividade e operador ternário numa linha só, se tem duas variaveis na condição e mais de duas intruções em cada uma das condições TRUE  e FALSE ?
	}
}

Eu vi teu exemplo Fernandosavio resolvendo com IF e recursividade mas esse eu assimilei.

alguma ideia ai ?

[quote=rafaelczy]Engraçado
Na apostila da caelum no fim do cap 4 - seção 4.13 pede pra resolver a serie fibonacci com recursividade e op. ternario em apenas uma linha.
Se eles pedem isso é pq é possível mas como se eu não posso ter duas variaveis dentro da condição e muito menos dar mais de uma instrução no caso FALSE e no caso TRUE

class Fibonacci {
	int calcula(int a, int b){
                return (se A vale 0 e B vale 1) ? IMPRIME a , b apos isso INCREMENTA a . b e CHAMA calcula(a,b) de novo : SE NAO ENTAO IMPRIME  a=a+b && b=b+a e CHAMA calcula(a,b) de novo; // se isso fosse possível resolveria o problema mas se nao é então como resolver com recursividade e operador ternário numa linha só, se tem duas variaveis na condição e mais de duas intruções em cada uma das condições TRUE  e FALSE ?
	}
}

Eu vi teu exemplo Fernandosavio resolvendo com IF e recursividade mas esse eu assimilei.

alguma ideia ai ?[/quote]

Sim welintom o seu exemplo e a teoria/sitaxe do op. ternario eu tb entendi. Mas o lance mesmo é como vc pode ver ai em cima eu fiz uma salada (literalmente) no código pra ilustrar: Temos duas variaveis dentro da condição pra retornar e ainda dentro do FALSE e dentro do TRUE tem mais de uma orientação como vc pode ver.
Fiz assim pq o exercicio pede pra resolver a serie fibonacci em 1 linha apenas com recursividade e op ternario.

Tem algum jeito na sua opinião de resolver como é pedido o exercicio ?
valeu