Aprendendo recursividade

bah q tanso rsss sou eu OO = orientação a objetos
Se alguem pudem me ajudar no post antes deste eu agradeço (comandos dentro do metodo contrutor gera() nao funfam)

Os comandos executam sim dentro do contrutor…

public class Gera{

	int[] fibonacci = new int[20];

	Gera(){
		fibonacci[0] = 0;
		fibonacci[1] = 1;
		System.out.print(this.fibonacci[0] + " - ");
		System.out.print(this.fibonacci[1] + " - ");
	}

	void calcula(int i){
		if (i < 20){
			this.fibonacci[i] = this.fibonacci[i - 1] + this.fibonacci[i - 2];
			System.out.print(fibonacci[i] + " - ");
			i = i + 1;
			calcula(i);
		}else
			return;
	}
}

e a main:

public class MainTeste {

	public static void main(String args[]){
		Gera x = new Gera();
		x.calcula(2);
	}
}

[quote=fernandosavio]Os comandos executam sim dentro do contrutor…

public class Gera{                                                                       // aqui tu botaste "public" antes do gera - pode me explicar?

	int[] fibonacci = new int[20];

	Gera(){
		fibonacci[0] = 0;
		fibonacci[1] = 1;
		System.out.print(this.fibonacci[0] + " - ");
		System.out.print(this.fibonacci[1] + " - ");
	}

	void calcula(int i){
		if (i < 20){                                                 // aqui tu substuíste o me 'while' por IF . Pq?
			this.fibonacci[i] = this.fibonacci[i - 1] + this.fibonacci[i - 2];
			System.out.print(fibonacci[i] + " - ");
			i = i + 1;
			calcula(i);
		}else
			return;
	}
}

e a main:

public class MainTeste {

	public static void main(String args[]){
		Gera x = new Gera();
		x.calcula(2);
	}
}

[/quote]
pelo q pude ver tu teve o TRABLHO CHATO de montar a pasta pra poder compilar. really thank’s men!!!
No fim de cada linha do teu codigo onde tive dúvida (2) coloquei minha pergunta. espero que apareça.

public, private e protected são modificadores de acesso. Ou seja, especifica quem poderá acessar sua classe!
Eu coloquei public porque sempre coloco nas minhas classes de teste, nenhum motivo especial, mas estude os modificadores de acesso.

E troquei seu while por if por um motivo. Ou você faz isso com while ou com recursividade.
O While é para você ter um algoritmo repetido x vezes (que é especificado na condição do laço)…
A Recursividade também é para ser repetida x vezes, só que você especifica esse critério de parada em um if (que no caso foi para mostrar apenas 20 elementos do vetor).

Quando eu compilei seu código com while ele entrou em pane! heheheh…
Imagina só:

  • Você chamou o método calcula(esse vai ser o método pai);
  • o método calcula(pai) chamou 20 métodos calcula(filho);
  • cada um dos 20 metodos calcula(filho) chamou 20 calcula(neto)…
  • Deu pra entender né? Entrou em looping infinito!

A recursão, didáticamente falando, é composta pelo seguinte:

  • Um IF com o critério de parada (senao entra em looping infinito);
  • E o else com o que você quer fazer.

É uma explicação bem porca mas quando você entender como funciona a recursividade vai conseguir formular coisa mais complexas…
Era isso, espero que tenha entendido, abraços.

Fernando: Explicação básica e facil de entender. thank’s men!!!
me impressiona q eu entrei 2 meses depois de ti nesses forum e tu sabe a lot of things mor than me! (or better: i don’t know anything!!)

Comecei a aprender java no inicio do ano cara!
Comecei com um professor de faculdade muito bom que me ensinou muito sobre OO. E eu corri muito atrás! Existem muitos materiais na internet e a documentação java ajuda muito… é só entender como funcionam as classes e interfaces que tu começa a entender tudo sozinho…
Qualquer coisa é só chama por MP que eu respondo!
Abração!

[quote=fernandosavio]Comecei a aprender java no inicio do ano cara!
Comecei com um professor de faculdade muito bom que me ensinou muito sobre OO. E eu corri muito atrás! Existem muitos materiais na internet e a documentação java ajuda muito… é só entender como funcionam as classes e interfaces que tu começa a entender tudo sozinho…
Qualquer coisa é só chama por MP que eu respondo!
Abração![/quote]
Ok men realy thank’s!
Por acaso o professor era o neri ?
pra que serve “MP” mesmo ? (olha nub de novo hehehe)

e ja esta trab na area friend? - qse um ano de java acho q ja da pra conseguir algo se estudar todos dias e tiver um pouco de talento ne?

MP = mensagem pessoal…
Estou trabalhando com PHP, javascript e um projeto separado em VB.NET. O Java mesmo que eu queria nao tem nada ainda…
Não é Neri o professor não. ehehheeh

Ternário é uma forma de atribuir um valor ou outro conforme uma determinada regra.

Ou seja, é para um uso muito específico.
Exemplo: int variavel = 0; if(condicao) { variavel = 1; } else { variavel = 2; }
Neste exemplo, variavel é inicializada com zero. De acordo com uma condição específica, se a mesma for verdadeira, é atribuido 1; se for falsa, é atribuído 2.
Neste contexto, podemos alterar para um ternário ( o operador ternário é representado por ?: )
Exemplo convertido:

int variavel = 0; variavel = condicao ? 1 : 2; ou int variavel = condicao ? 1 : 2; //A inicialização foi suprimida, neste exemplo é desnecessário.

O valor que fica entre ? e : deve ser do mesmo tipo que o que fica entre : e ;.

Não é permitida mais que uma instrução em cada parte do ternário, ou seja, o exemplo abaixo não é permitido.

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 }
Coloquei só a parte que interessa :wink:

Pensando nos seguintes modelos:

//if if(CONDICAO) { variavel = RESULTADO_CASO_CONDICAO_VERDADEIRO; } else { variavel = RESULTADO_CASO_CONDICAO_FALSO; } //ternário variavel = CONDICAO ? RESULTADO_CASO_CONDICAO_VERDADEIRO : RESULTADO_CASO_CONDICAO_FALSO;

Considere que o System.out.println pode sair (ou seja, deve ser posto em outro lugar).
Faça as trocas.

Obs.: Onde lê "variavel = " pode ser trocado por return .

Tente montar o ternário agora.

Cara,

Tenho a linha resolvida aqui. Só não postei pq o interesse é que você aprenda. Se teoricamente, você entendeu, não deve ser difícil resolver.
Como disse, montei a estrutura, é só trocar os bloquinhos. Teu único “problema” é onde vai ficar o Sysout. MAs isso te ajudo a resolver depois que você montar a linha do ternário.

if(b>500){ //CONDICAO return 0; //RESULTADO_CASO_CONDICAO_VERDADEIRO }else{ System.out.println(a); //tire isso daqui. return calculaFibonacci(b, a+b); //RESULTADO_CASO_CONDICAO_FALSO } //Coloque o return antes do ternário (não pode haver o return entre os sinais [b]?:;[/b])

Ternário é um pouco estranho mesmo, mas uma vez compreendido, fica muito simples :wink:

[quote=fernandosavio]Cara, o Wellington mastigou tudo pra você, não precisa nem pensar em nada é só pegar o código acima completar as lacunas no código abaixo:

return CONDICAO ? RESULTADO_CASO_CONDICAO_VERDADEIRO : RESULTADO_CASO_CONDICAO_FALSO ;

E eu tenho a apostila da Caelum também… É sim, um desafio, mas se você quer fazer em uma linha você não conseguirá imprimir!
E é um desafio estranho, porque qualquer programador que veja um código desses em uma linha já chutaria a canela de quem fez isso! Dar manutenção em código bruxo é fogo!
[/quote]Consegue imprimir sim :wink:
Existem malícias no ternário que só Beelzebuth pra agradecer :twisted:
Essa desse exercício é simples. Fica, inclusive, elegante hehe.

Só pra exemplificar HellCode, veja esse: I Love Ternary

Você ao menos tentou montar a estrutura da forma que eu descrevi?

[quote=rafaelczy]…
eu penso que terei de ser algo mais ou menos assim:

class Fibonacci {
	int calcula(int a, int b){
		return (b>500) ? 0 : System.out.println(a) DAI CHAMA calcula(b, a+b);	
	}
}

mas foi me dito que nao pode duas instrições nem no TRUE nem no FALSE. [/quote]
Sim, não pode mesmo. A idéia é quase essa. Tire o System.out.println(a) colocando-o na linha de cima primeiro.

int calcula(int a, int b){ System.out.println(a); return (b>500) ? 0 : calcula(b, a+b); }

Se quiser uma linha, alinhe os comandos e pronto, está tudo numa linha.

Hehehe… nem me atentei se o resultado estava correto. Pois peguei a lógica montada e remodelei para ternário.
Mas o importante é que você achou a lógica que precisava.

[quote=fernandosavio]Assim dá pra fazer uma classe toda em uma linha!
eauheuhaheuuahe[/quote]
É que, na minha opinião, a impressão do resultado não está inclusa nessa história de colocar numa linha só :wink:

[quote=rafaelczy]Bom galera, jamais pensei q iria encher 3 paginas de posts pra gerar esse fibonacci de todas formas pedidas (num de var livre, depois 2 var apenas, depois recursividade, depois ternario + recursividade + 1 linha só) ufsss… 7 dias morando no forum…
mas valeu
fixei legal recursividade e op ternario
parabens ai pros atores principais da comedia q ajudaram e determinaram o sucesso
Welligton nogueira e Fernando savio
a todos demais thank’s to!

After thousands of years in caelum apostila charpeter 4 finaly going to the charpter 5 :shock: [/quote]:thumbup: