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:
(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
Posso estar errado mas acredito que exista algo estranho naquele i++ no seu código.
Bom, eu fiz um teste aqui bem assim:
publicclassTeste{publicstaticvoidmain(String[]args){longtempoInicial=System.currentTimeMillis();longx=999999999,y=0;for(inti=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();longa=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
Tiago_Manzato
Obrigado!!! Agora já sei que função posso usar para realizar testes de performance
S
Sem_Nome
Lembre-se que a JVM sempre se comporta de maneira diferente.
D
denisGermano1 like
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:
publicclassJavaApplication3{publicstaticvoidmain(String[]args){longtempoInicial=System.currentTimeMillis();longx=999999999,y=0;for(intj=0;j<10000000;j++){for(inti=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();longa=999999999,b=0;for(inti=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