First, I think you should read n1
and n2
within while
, otherwise it does not make much sense to ask the user this and while
would end up being equivalent to if
Second, using System.exit(0)
is not good programming practice. Avoid using this.
Third, that mdc
is an operation that only makes sense with integers, so it's strange to use double
for this.
Fourth, package names should always be in lowercase, so Aula01
would be called aula01
.
Fifth, it is not good practice to eat letters of the variable name, and therefore Exercicio01
would be better than Exer01
.
But now, focusing on your doubt, there are several ways you can do this. Done 5 of these forms below:
-
Static variable - Considered the simplest alternative. But it does not work when you have multiple threads.
package aula01;
import javax.swing.JOptionPane;
public class Exercicio01 {
private static int contador = 0;
public static int mdc(int dividendo, int divisor) {
contador++;
if (dividendo % divisor == 0) {
return divisor;
}
return mdc(divisor, dividendo % divisor);
}
public static void main(String[] args) {
while (true) {
int n1 = Integer.parseInt(JOptionPane.showInputDialog(null,
"Digite o primeiro número ou -1 para sair do programa."));
int n2 = Integer.parseInt(JOptionPane.showInputDialog(null,
"Digite o segundo número ou -1 para sair do programa."));
if (n1 == -1 || n2 == -1) break;
contador = 0;
int resposta = mdc(n1, n2);
JOptionPane.showMessageDialog(null,
"O resultado do MDC é: " + resposta +
"\n Ocorreram " + contador + " recursões.");
}
}
}
-
Thread-local variable - Similar to the above but somewhat more complicated option, it works when there are multiple threads.
package aula01;
import javax.swing.JOptionPane;
public class Exercicio01 {
private static final ThreadLocal<Integer> CONTADOR = new ThreadLocal<>();
public static int mdc(int dividendo, int divisor) {
CONTADOR.set(CONTADOR.get() + 1);
if (dividendo % divisor == 0) {
return divisor;
}
return mdc(divisor, dividendo % divisor);
}
public static void main(String[] args) {
while (true) {
int n1 = Integer.parseInt(JOptionPane.showInputDialog(null,
"Digite o primeiro número ou -1 para sair do programa."));
int n2 = Integer.parseInt(JOptionPane.showInputDialog(null,
"Digite o segundo número ou -1 para sair do programa."));
if (n1 == -1 || n2 == -1) break;
CONTADOR.set(0);
int resposta = mdc(n1, n2);
JOptionPane.showMessageDialog(null,
"O resultado do MDC é: " + resposta +
"\n Ocorreram " + CONTADOR.get() + " recursões.");
}
}
}
-
Create a class to represent the output of the function also containing recursion data. - It tends to complicate the use of the function.
package aula01;
import javax.swing.JOptionPane;
public class Exercicio01 {
public static final class ResultadoMdc {
private final int valor;
private final int recursoes;
public ResultadoMdc(int valor, int recursoes) {
this.valor = valor;
this.recursoes = recursoes;
}
public int getValor() {
return valor;
}
public int getRecursoes() {
return recursoes;
}
}
private static ResultadoMdc mdc(int dividendo, int divisor, int recursoes) {
if (dividendo % divisor == 0) {
return new ResultadoMdc(divisor, recursoes);
}
return mdc(divisor, dividendo % divisor, recursoes + 1);
}
public static ResultadoMdc mdc(int dividendo, int divisor) {
return mdc(dividendo, divisor, 0);
}
public static void main(String[] args) {
while (true) {
int n1 = Integer.parseInt(JOptionPane.showInputDialog(null,
"Digite o primeiro número ou -1 para sair do programa."));
int n2 = Integer.parseInt(JOptionPane.showInputDialog(null,
"Digite o segundo número ou -1 para sair do programa."));
if (n1 == -1 || n2 == -1) break;
ResultadoMdc resposta = mdc(n1, n2);
JOptionPane.showMessageDialog(null,
"O resultado do MDC é: " + resposta.getValor() +
"\n Ocorreram " + resposta.getRecursoes() + " recursões.");
}
}
}
-
Pass an additional parameter to the function that represents a counter - Complies with the signature of the method. There are two ways to do this. One is using int[]
and the other is using AtomicInteger
.
With int[]
:
package aula01;
import javax.swing.JOptionPane;
public class Exercicio01 {
public static int mdc(int dividendo, int divisor, int[] contador) {
contador[0]++;
if (dividendo % divisor == 0) {
return divisor;
}
return mdc(divisor, dividendo % divisor, contador);
}
public static void main(String[] args) {
while (true) {
int n1 = Integer.parseInt(JOptionPane.showInputDialog(null,
"Digite o primeiro número ou -1 para sair do programa."));
int n2 = Integer.parseInt(JOptionPane.showInputDialog(null,
"Digite o segundo número ou -1 para sair do programa."));
if (n1 == -1 || n2 == -1) break;
int[] contador = {0};
int resposta = mdc(n1, n2, contador);
JOptionPane.showMessageDialog(null,
"O resultado do MDC é: " + resposta +
"\n Ocorreram " + contador[0] + " recursões.");
}
}
}
With AtomicInteger
:
package aula01;
import javax.swing.JOptionPane;
import java.util.concurrent.atomic.AtomicInteger;
public class Exercicio01 {
public static int mdc(int dividendo, int divisor, AtomicInteger contador) {
contador.increment();
if (dividendo % divisor == 0) {
return divisor;
}
return mdc(divisor, dividendo % divisor, contador);
}
public static void main(String[] args) {
while (true) {
int n1 = Integer.parseInt(JOptionPane.showInputDialog(null,
"Digite o primeiro número ou -1 para sair do programa."));
int n2 = Integer.parseInt(JOptionPane.showInputDialog(null,
"Digite o segundo número ou -1 para sair do programa."));
if (n1 == -1 || n2 == -1) break;
AtomicInteger contador = new AtomicInteger(0);
int resposta = mdc(n1, n2, contador);
JOptionPane.showMessageDialog(null,
"O resultado do MDC é: " + resposta +
"\n Ocorreram " + contador.get() + " recursões.");
}
}
}