Exercicio de divisao do Caelum

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:

  1. uso de expressões repetitivas (a mesma expressão de comparação utilizadas várias vezes);
  2. utilização de comandos para quebra dos fluxo de execução (break);
  3. 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){
  1. os uso de condicionais duplas como em:

if (y % 2 != 0){ while (y % 2 != 0 ) {

  1. 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:

  1. será que a solução não pode ser recursiva?
  2. Se puder leia o livro: “A Prática da Programação” de Brian w Kernighan e Rob Pike. Valerá a pena.

boa sorte.

Tenta isso:

public static void main(String[] args) {
		int x=180;
		int y;
		
		while(x!=1){
			if(x%2==0){
				y=x/2;
			}
			else{
				y=3*x+1;
			}
			x=y;
		
			System.out.print(y+",");
		}
	}

[quote=Juninho Andrade]Tenta isso:

[code]
public static void main(String[] args) {
int x=180;
int y;

	while(x!=1){
		if(x%2==0){
			y=x/2;
		}
		else{
			y=3*x+1;
		}
		x=y;
	
		System.out.print(y+",");
	}
}

[/code][/quote]

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.

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.

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.

Obrigado mesmo.

Eu já abracei o capeta. Agora o negócio é começar a dançar.

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!

[code]class Exercicio8{
static public void main(String[] args){

	int x = 13;
	int y;
	
	if(x%2 == 0){
		y = x/2;
		x = y;
		System.out.print(y + ">");
	}else{
		y = (3 * x) + 1;
		x = y;
		System.out.print(y + ">");
	}
	
	for(int contador = 1;contador < y;contador ++){
		if(y%2 == 0){
			y = x/2;
			x = y;
		}else{
			y = (3 * x) + 1;
            x = y;				
		}
		System.out.print(y + ">");
	}
}

}[/code]

Eu fiz assim mas não imprime até 1 de jeito nenhum porque?