Проверьте, является ли число простым, используя рекурсию - PullRequest
0 голосов
/ 02 декабря 2018

Это рекурсивная проверка, если это простое число - это правильно?

public static boolean isPrimeRecursive (int n,int i){//i eqoual to n
    if (n <= 1) {  
       return false;  
    }if (i==1){
        return false;
    }if(n%i==0){
        return false;
    }

   return isPrimeRecursive(n,i--);
}

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Я бы не стал обременять вашего пользователя этим загадочным вторым аргументом, а скорее представил бы другой метод, состоящий только из одного аргумента, который сначала имеет дело с числами меньше 2 и даже числами, а затем вызывает в вашем рекурсивном методе правильные аргументы:

private static boolean isPrimeRecursive(int n, int i) {

    if (i * i > n) {
        return true;
    }

    if (n % i == 0) {
        return false;
    }

    return isPrimeRecursive(n, i + 2);
}

public static boolean isPrime(int n) {

    if (n <= 2 || n % 2 == 0) {
        return (n == 2);
    }

    return isPrimeRecursive(n, 3);
}

public static void main(String[] args) {

    System.out.println(isPrime(Integer.parseInt(args[0])));
}
0 голосов
/ 02 декабря 2018

С вашим кодом вы должны начинать с i со значения n-1, поскольку n % n всегда верно для простых чисел.

Тогда в вашем состоянии (if (i == 1) { ... }, должно возвращаться trueпотому что если метод достигает значения 1, то он удовлетворяет всем остальным условиям.

Наконец, в вашем операторе возврата return isPrimeRecursive(n, i++); лучше использовать ++i, поскольку i++ будет увеличиваться после выполненияфункция со значением i.

public static boolean isPrimeRecursive (int n,int i){
    if (n <= 1) {  
       return false;  
    }

    if (i == 1) {
        return true;
    }

    if(n % i == 0){
        return false;
    }

   return isPrimeRecursive(n, --i);
}

В вашей основной функции вы затем будете использовать:

int n = 17;

System.out.println(isPrimeRecursive(n, n-1);

Другой способ сделать это - всегда запустить iсо значением 2 и увеличиваем его значение. Оттуда.

public static boolean isPrimeRecursive (int n, int i) {
    if (n <= 2) {  
       return (n == 2) ? true : false;  
    }

    if (i >= n) {
        return true;
    }

    if (n % i == 0) {
        return false;
    }

    return isPrimeRecursive(n, ++i);
}

Затем вы просто делаете:

int n = 17;

System.out.println(isPrimeRecursive(n, 2);
...