Recursividade?

8 respostas
pedrinho98765

I ai, galera,
sou mto nub em java, mais to fazendo curso tecnico e tenho q aprender…
to precisando de ajuda com um probleminha na apostila da Caelum fj-11

Escreva um programa que, dada uma variável x (com valor 180, por exemplo), temos y de acordo
com a seguinte regra:
se x é par, y = x / 2
se x é impar, y = 3 * x + 1
imprime y
O programa deve então jogar o valor de y em x e continuar até que y tenha o valor final de 1. Por
exemplo, para x = 13, a saída será:
40 -> 20 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1

O codigo é esse aki:

public class Função {
	
	int y;
	
	void function(int x) {
		if ((x%2)==0) {
			y=(x/2);
			}
		else {
			y=(3*x)+1;
			}
		System.out.println("\n\ny="+y);
		
		x=y;
		
		 int z = (int) y%2;
		 
		 while (z==0) {
			 y /= 2;
			 System.out.println(y);
		 }
		 if (z!=0) {
			 this.function(y);
		 }
		 
	}	
}

Eu optei por imprimir um número em cada linha ao invés de na mesma com ‘->’…
Escrevi a classe Main, instanciei o objeto tudo certinho, mas a saida é:
y=40
20
10
5 (aqui seria onde ele usaria a recursividade e reexecutaria o metodo para transformar o 5 em 16)
1
0
0
0

e os zeros não param de ser impressos, tipo um loop infinito…
como eu faço pra arrumar isso???
e como otimizar esse código (utilizar menos linhas de código, ou um código com execução mais rápida, ou os 2, se possível) ???

8 Respostas

pmlm

Duas coisas:

O teu método não tem condição de paragem. Em lado nenhum dizes que deve para quando y for igual a 1.

O teu while nunca altera o valor de z. Logo, se entrar no while nunca mais vai ser. No entanto, para este caso concreto, e se é para usar recursividade, nem sequer deverias ter o while.

pedrinho98765

como deveria ficar a parte do while em diante entao???
tipo…
eu colokei uma condiçao para parar o while:

if (y==1) {
				 break;
			 }

mais ainda ñ reexecuta o método kuando y é impar!!
como procedo???

R

eu notei algumas coisas…

  • vc coloca x=y e não usa mais o x… pode tirar essa linha tranquilamente

  • tire a linha int z = (int) y%2;

  • no while tira tudo… deixe isso:

while (y>1) {  
     this.function(y);  
}

Nem testei… veja ae se estou certo e ja corrige…

pedrinho98765

redr4gon:
eu notei algumas coisas…

  • vc coloca x=y e não usa mais o x… pode tirar essa linha tranquilamente

  • tire a linha int z = (int) y%2;

  • no while tira tudo… deixe isso:

while (y>1) {  
     this.function(y);  
}

Nem testei… veja ae se estou certo e ja corrige…

ow valew mano… pegei o q vc falow e adaptei aki…
como ficou a otimizaçao??? (essa pergunta é para todos que verem esse código)
vlew mano… e vo passa uma copia do codigo so pra galera te uma noçao!!

public class Função {
	
	int y;
	
	void function(int x) {
		if (y==0) {
			System.out.print("\n\nf(x)\n{");
			}
		
		if ((x%2)==0) {
			y=(x/2);
			}
		else {
			y=(3*x)+1;
			}

		if (y!=1) {
			System.out.print(" "+y+" ->");
			}
		else {
			System.out.print(" 1 }");
			}
		
		while (y>1) {
			this.function(y);
			}
		y /= 2;
		}
	}
pmlm

Pegando nas regras definidas inicialmente:

private void function(int x){
     int y;
     if (x % 2 == 0){
         // se x é par, y = x / 2
         y = x / 2;
     } else {
        // se x é impar, y = 3 * x + 1
         y = 3 * x + 1
     }

    // imprime y
    System.out.println(y);

    if (y != 1){
         // O programa deve então jogar o valor de y em x e continuar até que y tenha o valor final de 1.
         function(y);
   }
}
F

wellington.nogueira:
pedrinho98765, só uma dica: ao escrever, faça as seguintes substituições:

  • mais -> mas
  • aki -> aqui
  • kuando -> quando
  • y -> e
    ;)

Uma dica, pedrinho, aqui não é um mmorpg ou qualquer outro desses joguinhos por ai. Escreva bem o suficiente para entendermos. Deixe para usar esses termos do msn em outro lugar porque fica horrível para entendermos.

pedrinho98765

Beleza, pessoal!!!
Desculpa pela forma de escrita.

E valeu, Wellington.n; consegui fazer o código ficar mais claro!!!

Brigado galera!

WellingtonRamos

pedrinho98765, só uma dica: ao escrever, faça as seguintes substituições:

  • mais -> mas
  • kuando -> quando
  • y -> e
    :wink:
Criado 4 de julho de 2011
Ultima resposta 5 de jul. de 2011
Respostas 8
Participantes 5