recursão por Orientação a Objeto - AJUDA

21 respostas
DavidUser

O problema é esse:
Um método pode chamar ele mesmo. Chamamos isso de recursão. Você pode resolver a série de fibonacci
usando um método que chama ele mesmo. O objetivo é você criar uma classe, que possa ser usada da
seguinte maneira:

Fibonacci fibo = new Fibonacci(); int i = fibo.calculaFibonacci(5); System.out.println(i);
Aqui imprimirá 8, já que este é o sexto número da série.
Este método calculaFibonacci não pode ter nenhum laço, só pode chamar ele mesmo como método. Pense
nele como uma função, que usa a própria função para calcular o resultado.

é de uma apostila da caelum.
o meu funciona perfeitamente mais acho q não é isso que queriam:

class FibonaciProgram{//1,1,2,3,5,8,13,21,... int i=1; public static void main(String[]args){ FibonaciProgram fibo=new FibonaciProgram(); fibo.calculaFibonacci(1,1,5); } void calculaFibonacci(int y,int x,int limite){ System.out.println(y+x);y=y+x; ++i; if(i<limite)System.out.println(x+y); x=y+x; ++i; if(i<limite)calculaFibonacci(y,x,limite); } }

21 Respostas

DavidUser

como ele so que o último resultado aperfeiçoei o método calculaFibonacci:

void calculaFibonacci(int y,int x,int limite){ y=y+x; ++i; if (i==limite)System.out.println(y+x); x=y+x; ++i; if (i==limite)System.out.println(y+x); if(i<limite)calculaFibonacci(y,x,limite); }

DavidUser

Agora tenho certeza que não era desse modo a resolução ,a questão 2 pede para aperdeiçoar o método de chamamento em uma linha usando o “ternary operator”

Balena

O seu problema está na recursão

recursão seria mais ou menos isso…

if(i<limite){ nome_funcao(parametros); }else{ variavel_retorno += nº sequencia; }

Não sei se ficou bem explicado mas qualque coisa pergunta de volta…>

DavidUser

da pra ser mais claro? é necessário criar um método de retorno

DavidUser

como é a sequência de fibonacci, não é uma seqüência com medida exata, então da mais trabalho tenho sempre que armazenar o valor do último termo para adicionar ao proximo.

Balena

Já leu alguma coisa sobre pilha?

Sabe o que é uma pilha?

É mais ou menos como uma pilha que funciona uma função recursiva, entende alguma coisa de C?

todos os métodos que tenho recursivos aqui estão em C então se me disseres que entende eu posso passar alguns pra vc olhar.

Balena

Vamos dizer assim no caso da Sequência de Fibonacci você teria o seguinte.

os testes condicionais são realizados.

public void fibonacci(nrTermo){ int num_fibo = 0; if (nrTermo > 0){ num_fibo += fibonacci(nrTermo--); }else{ if (nrTermo == 1) || (nrTermo == 2){ num_fibo += 1; } } }

Não sei se da pra entender agora.

DavidUser
bem não entendo muito sobre C,

vc chama de pilha o agrupamento de laços?ex.:

pilha:

for(){

for(){

for(){

}

}

}

se for isso não posso usalo, pois no enunciado se restringe o uso de laços (loops prontos(do…while,while,for,switch))

DavidUser

pra começar: se esse é um método void não ha como adicionar nenhum valor a num_fibo

DavidUser

seguindo esta lógica vc acaba criando oq chamamos de paradigma, vai haver um loop infinito e sem respostas alem de exceções.

Balena

Eu posso associar o valor que eu quiser a variável que eu quiser, por ele ser um método void terei que usar cast ao retornar o valor…
mas nada me impede de retorná-lo…
A pilha que falo é uma pilha como uma pilha de pratos, vista em estrutura de dados, melhor dar uma olhada no assunto…
ficará mais fácil de entender o que é a recursão, qual o poder computacional dela.

rodrigo.bossini
class teste{

	public static void main (String args []){
		System.out.print (fibonacci (6));
	}

	static int fibonacci (int i){
		return ((i == 0 || i == 1) ? i : (fibonacci (i - 1) + fibonacci (i - 2)));
	}
	
}
DavidUser

como este é um exercício da apostila caelum RJ-11, onde antes não são descritos essa tal pilha o problema deve ser resolvido com a programação básica , antes mencionada.

afinal oq eu quis dizer é que como o método não retorna nenhum valor não a valor a ser convertido,
“o método não retorna nada”.

Balena

Só quiz ajudar…
recursão é uma forma de pilha que é implementada pelo compilador…
e sim o método retorna qualquer coisa…
dá uma olhada em tipos de retorno genéricos…

rodrigo.bossini

DavidUser:
como este é um exercício da apostila caelum RJ-11, onde antes não são descritos essa tal pilha o problema deve ser resolvido com a programação básica , antes mencionada.

afinal oq eu quis dizer é que como o método não retorna nenhum valor não a valor a ser convertido,
“o método não retorna nada”.

Pelo visto você não entendeu nada ainda. Não entendeu o que é recursão, não entendeu o que é a série de Fibonacci e não entendeu o exercício da apostila.

Clique aqui para aprender o que é a sequencia de fibonacci.
Clique aqui para aprender o que é recursão.

Depois disso, leia de novo o exercício na apostila e tente entendê-lo antes de tentar programar.

DavidUser

rod.attack
Cara, vlw msm.

tem como me explicar seu raciocínio é q tipo, viajei no seu código “ultra-light”

DavidUser

eu achava q o modo mais simples era:
declarar dois valores e os somar assim:

int x=1,y=2;
x+=y;//3
y+=x;//5
//segue...
DavidUser

ainda não deu pra entender a tal função: F(n)

pra mim funcionava assim:
1,2,3,5,8,…

então se inicializo com 1 e 2:

int x=1,y=2; //o proximo valor é a soma então pensei: x,y,x,y,x,y,... x=x+y; y=y+x;
:!:
e repito a seqüência, mas sem laços fica daqule geito q fiz no início.

pode me explicar o tal: F(n)={F(n-1)+F(n-2)}

DavidUser

Ou seja, no sexto mês foram gerados 8 coelhos

F(6) = (F(6) - 1) + (F(6) - 2) = 5 e 4 -> 8 ( Soma do Resultado de F(5) e F(4) )
F(5) = (F(5) - 1) + (F(5) - 2) = 4 e 3 -> 5 ( Soma do Resultado de F(4) e F(3) )
F(4) = (F(4) - 1) + (F(4) - 2) = 3 e 2 -> 3 ( Soma do Resultado de F(3) e F(2) )
F(3) = (F(3) - 1) + (F(3) - 2) = 2 e 1 -> 2
F(2) = (F(2) - 1) + (F(2) - 2) = 1 e 0 -> 1

e a primeiras posições 1.

não entendi oq aconteceu em F(5) e F(6)

Vingdel

DavidUser:
Ou seja, no sexto mês foram gerados 8 coelhos

F(6) = (F(6) - 1) + (F(6) - 2) = 5 e 4 -> 8 ( Soma do Resultado de F(5) e F(4) )
F(5) = (F(5) - 1) + (F(5) - 2) = 4 e 3 -> 5 ( Soma do Resultado de F(4) e F(3) )
F(4) = (F(4) - 1) + (F(4) - 2) = 3 e 2 -> 3 ( Soma do Resultado de F(3) e F(2) )
F(3) = (F(3) - 1) + (F(3) - 2) = 2 e 1 -> 2
F(2) = (F(2) - 1) + (F(2) - 2) = 1 e 0 -> 1

e a primeiras posições 1.

não entendi oq aconteceu em F(5) e F(6)

Isso é o que acontece:[b]

LEGENDA: As cores dos colchetes indicam as cores dos resultados do número que eles envolvem. EX.: [color=red][[/color][color=blue]2[/color][color=green]][/color] = [color=red]1[/color] + [color=green]0[/color]… Os números 0 (zero) e 1 (hum) não possuem colchetes pois eles resultam a si próprios, bastando repeti-los na mesma cor.

[color=red][[/color]f(3)[color=green]][/color]  
     [color=green][[/color][color=red]2[/color][color=blue]][/color]    +    [color=green]1[/color]  
   [color=green]1[/color] + [color=blue]0[/color]  +  [color=green]1[/color]   = 2

              [color=red][[/color]f(4)[color=green]][/color]  
       [color=green][[/color][color=red]3[/color][color=blue]][/color]       +       [color=red][[/color][color=green]2[/color][color=blue]][/color]
 [color=blue][[/color][color=green]2[/color][color=red]][/color]     +   [color=blue]1[/color]   +   [color=red]1[/color]   +   [color=blue]0[/color]

[color=blue]1[/color] + [color=red]0[/color] + [color=blue]1[/color] + [color=red]1[/color] + [color=blue]0[/color] = 3

[color=green][[/color]f(5)[color=blue]][/color]
                [color=red][[/color][color=green]4[/color][color=blue]][/color]             +             [color=green][[/color][color=blue]3[/color][color=red]][/color]
         [color=blue][[/color][color=red]3[/color][color=green]][/color]      +      [color=red][[/color][color=blue]2[/color][color=green]][/color]      +      [color=blue][[/color][color=green]2[/color][color=green]][/color]      +      [color=red]1[/color]
     [color=green][[/color][color=blue]2[/color][color=red]][/color]   +   [color=green]1[/color]  +   [color=red]1[/color]  +  [color=green]0[/color]   +    [color=blue]1[/color] +  [color=green]0[/color]   +      [color=red]1[/color]
    [color=green]1[/color]+[color=red]0[/color]  +   [color=green]1[/color]  +   [color=red]1[/color]  +  [color=green]0[/color]   +    [color=blue]1[/color] +  [color=green]0[/color]   +      [color=red]1[/color] = 5

[/b]

rod.attack, me corrija se minha explicação estiver arrada…

DaviUser, espero que isso te ajude a entender… pois deu trabalho fazer isso…

Abraço!

B

Funções recursivas são funções que chamam a si próprias para calcular algo.

A recursão é composta de duas partes:

[list]A primeira é a condição de parada. Se a função não alcançar a condição de parada, ela ficará rodando infinitamente, ou até acabar a memória da máquina.[/list]
[list]A segunda parte é a chamada a si própria, passando como argumento um valor que chegue mais perto da condição de parada. Este argumento deve ser menor(ou maior, depende da condição de parada) que o parâmetro que foi passado no início desta função.[/list]

No caso de Fibonacci:
[list]A condição de parada é quando o parâmetro receber 1 ou 0.[/list]
[list]Não recebendo 0 ou 1, a função irá chamar a sí própria, primeiro com fibonacci do parâmetro menos 1, e com fibonacci do parâmetro menos 2.[/list]

Como Fibonacci retorna um valor, retornará 0, 1, ou o resultado de fibonacci(n-1) + fibonacci(n-2). Lembrando que não existe fibonacci de números negativos.

Criado 9 de maio de 2009
Ultima resposta 1 de set. de 2009
Respostas 21
Participantes 5