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
publicstaticvoidmain(String[]args){intx=13;// independente do valor de x, y tem que chegar a 1.inty=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.
falou.
S
srolbh
Valeu pela ajuda pessoal.
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.
D
Dieval_Guizelini
Fica frio e vai treinando.
quanto mais você se exercitar melhor irá ficar os seus programas.
Uma das habilidades necessária para programar é a destreza e ela só se obtém com a prática.
Durante a prática você deve sempre focar em três coisas:
a) algoritmo
b) estrutura de dados
c) conhecimento da linguagem e suas bibliotecas (APIs).
falou, precisando poste ai que nós tentamos ajudar.
S
srolbh
Obrigado mesmo.
Eu já abracei o capeta. Agora o negócio é começar a dançar.
P
Paulo_Silveira
essa é a famosa conjectura de Collatz , vulgar problema do 3n+1, nao foi a toa que colocamos isso na apostila da caelum (coisa de nerd hein?).
ela NUNCA foi provada… se voce provar que sempre funciona, virara um matematico famoso!