Olá, a solução que encontrei para o seguinte exercício segue abaixo.
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
public static void main(String[] args) {
int x = 13; // independente do valor de x, y tem que chegar a 1.
int y = 0;
// aplicando a primeira regra EX.: se x e par, calculo A. se é impar, calculo B.
if (x % 2 == 0){
y = x / 2;
} else {
y = 3 * x + 1;
}
System.out.println("valor de Y: "+ y); // imprime y, como solicitado.
x = y; // joga valor de y em x, como solicitado.
// Agora a favela começa, se Y está como par ele cai aqui:
if (y % 2 == 0) {
// enquanto y for impar ele vai reconfigurando até achar um.
while (y % 2 == 0){
x = y;
y = x / 2;
x = y;
// achou 1 BREAK! THE END...
if (y == 1)
break;
if (y % 2 != 0){
while (y % 2 != 0){
y = 3 * x + 1;
};
}
};
} else { // mas se Y estiver como impar ele cai aqui:
while (y % 2 != 0){
y = 3 * x + 1;
if (y % 2 == 0){
while (y % 2 == 0){
x = y;
y = x / 2;
x = y;
};
// achou 1 BREAK! THE END...
if (y == 1)
break;
}
};
}
System.out.println("valor de Y: "+ y); // finalmente ele imprime o cara chato!
}
O que eu quero saber é o seguinte: se está implementacao está correta e eficiente ou se eu dei muitas voltas desnecessárias. Valeu!
Para podermos te dar uma nota pela solução precisariamos saber por exemplo:
a) quanto tempo de desenvolvimento você tem?
b) você está cursando uma graduação em infromática?
c) você conhece ou programa em outras linguagens?
O porque das perguntas, é bem simples, a sua solução aparentemente resolve o problema, logo é eficiente, mas e quanto a eficácia?
podemos detectar problemas como:
uso de expressões repetitivas (a mesma expressão de comparação utilizadas várias vezes);
utilização de comandos para quebra dos fluxo de execução (break);
comentário que não condiz com o código fonte (por exemplo)
// enquanto y for impar ele vai reconfigurando até achar um.
while (y % 2 == 0){
os uso de condicionais duplas como em:
if (y % 2 != 0){
while (y % 2 != 0 ) {
atribuições desnecessárias, como em:
x = y;
y = x / 2;
x = y;
enfim, tem vários problemas em seu código… acho que você consegue produzir algo melhor.
Duas dicas:
será que a solução não pode ser recursiva?
Se puder leia o livro: “A Prática da Programação” de Brian w Kernighan e Rob Pike. Valerá a pena.
Pô Juninho você deixou o cara perder uma oportunidade para melhorar o algoritmo dele… mas como a solução ta posta eu a complemento com a seguinte sugestão:
substitua o y por x e você deixa de usar uma variável e reduz uma atribuição dentro de um laço.
Eu programo desde julho aproximadamente, mas eu não tenho muita prática e apanho demais pra lógica.
O problema é que eu quis seguir ao pé da letra o enunciado e fui construindo o código fragmentado pelos tópicos do exercício.
Com relação ao uso de um if e um while com a mesma condição, foi um erro estúpido mesmo rs… Com relação ao erro nos comentários, foi falta de atenção e pressa na hora de fazê-los. O break eu usei por prática para acompanhar o capitulo mesmo.
Estou estudando java a partir do livro do Deitel e da apostila da Caelum.
A verdade é que tenho tanto medo da lógica que não enxergo as soluções mais simples.