Exercício 7 (opcional) Apostila FJ11 Caelum

4 respostas
T

Boa tarde galera,

Sou novo no fórum e gostaria de tirar algumas dúvidas sobre os códigos que escrevi.

O enunciado do exercício diz o seguinte:

  1. (opcional) 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

Eu escrevi 2 códigos diferentes:

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

e:

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

Existe alguma diferença entre os dois códigos? Por exemplo, em questão de performance?

4 Respostas

S

Posso estar errado mas acredito que exista algo estranho naquele i++ no seu código.

Bom, eu fiz um teste aqui bem assim:
public class Teste {

	public static void main(String[] args) {
		long tempoInicial = System.currentTimeMillis();
		long x = 999999999, y = 0;
		for (int i = 0; y != 1; i++) {
			if (x % 2 == 0) {
				y = x / 2;
			} else {
				y = 3 * x + 1;
			}
			System.out.print(y + ", ");
			x = y;
		}
		
		System.out.println("\nPrimeiro metodo concluido em " + (System.currentTimeMillis() - tempoInicial));
		TempoInicial = System.currentTimeMillis();
		long a = 999999999, b = 0;
		while (b != 1) {
			if (a % 2 == 0) {
				b = a / 2;
			} else {
				b = 3 * a + 1;
			}
			System.out.print(b + ", ");
			a = b;
		}
		System.out.println("\nSegundo metodo concluido em " + (System.currentTimeMillis() - TempoInicial));
	}

}

Aparentemente o primeiro é mais devagar. Realizei 10 testes, todos indicaram que o primeiro demorava mais.

T

Obrigado!!! Agora já sei que função posso usar para realizar testes de performance :smiley:

S

Lembre-se que a JVM sempre se comporta de maneira diferente.

D

O correto para vc utilizar é a função do while, o laço for deve ser usado em laços de repetiçao que vc conhece a quantidade de vezes necessarias para fazer algo.
Ja o while é testado a afirmação se deve ou nao executar o conteudo dentro laço , sem saber quantas vezes será necessaria.
e o laço do - while é usado quando deve ser repetido ao menos uma vez e depois o que for necessario até se tornar uma expressão falsa.

e quanto ao performance, não ha grande diferença
pode fazer uns testes como esse:

public class JavaApplication3 {

    public static void main(String[] args) {
        long tempoInicial = System.currentTimeMillis();
        long x = 999999999, y = 0;
        for (int j = 0; j < 10000000; j++) {
            for (int i = 0; y != 1; i++) {
                if (x % 2 == 0) {
                    y = x / 2;
                } else {
                    y = 3 * x + 1;
                }
                System.out.print(y + ", ");
                x = y;
            }
        }
        System.out.println("\nPrimeiro metodo concluido em " + (System.currentTimeMillis() - tempoInicial));
        tempoInicial = System.currentTimeMillis();
        long a = 999999999, b = 0;
        for (int i = 0; i < 10000000; i++) {
          while (b != 1) {
                if (a % 2 == 0) {
                    b = a / 2;
                } else {
                    b = 3 * a + 1;
                }
                System.out.print(b + ", ");
                a = b;
            }
        }
        System.out.println("\nSegundo metodo concluido em " + (System.currentTimeMillis() - tempoInicial));
    }
}

hora um é mais rapido, hora outro é mais rapido.
e outra, na que utilizou o for, a variavel i dentro dentro dele não serve para nada. só cria uma variavel na memoria atoa, ela não é usada para o teste pois usou o Y
pode-se intão omitilo

... for( ; y!=1 ; ){ ...
Criado 24 de abril de 2012
Ultima resposta 24 de abr. de 2012
Respostas 4
Participantes 3