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) ???