вот код (Java):
class prime
{
public static boolean prime (int a, int b)
{
if (a == 0)
{
return false;
}
else if ((a%(b-1) == 0) && (b>2))
{
return false;
}
else if (b>1)
{
return (prime (a, b-1)) ;
}
else
{
return true;
}
}
public static void main (String[] arg)
{
System.out.println (prime (7, 7)) ;
}
}
Это - сообщение об ошибке, которое я получаю, когда я пытаюсь выполнить его (оно компилирует прекрасный):
Exception in thread "main" java.lang.ArithmeticException: / by zero
at prime.prime(prime.java:10)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.main(prime.java:27)
Таким образом, это означает, что я разделил на нуль некоторых как правильный? или это означает что-то еще? Я не вижу, как я делюсь на нуль. Что пошло не так, как надо?
Попробуйте изменить это значение с
if ((a%(b-1) == 0) && (b>2))
на
if ((b>2) && a%(b-1)==0)
. Происходит то, что операция a% (b-1)
выполняется перед тестом b> 2
.
После переключения вы используете оценку короткого замыкания . Как только тест b> 2 вернет false, нет необходимости вычислять модуль (следовательно, избегая деления)
Я предполагаю, что любой код вида x% 0
вызовет эту ошибку. Ваш код не защищает от такой возможности.
Из-за рекурсивного вызова:
return (prime (a, b-1)) ;
В какой-то момент вы будете вызывать prime со значением для b, равным 1. Это означает, что во втором условии вы будете проверять a%0
. Поскольку оператор modulo (%) по сути является делителем, это приводит к проблеме деления на ноль.
Решение, вероятно, заключается в том, чтобы поймать этот случай, чтобы обеспечить b > 2 в вашем условии перед выполнением %.