Печать простых чисел в Java с использованием рекурсии

Я написал аналогичную функцию в C, и смог достичь требуемого результата в отличие от Java. Ниже приведен код, который проверяет, является ли число простым рекурсивным. В сборнике написано, что мне не хватает возврата. Число, которое нужно проверить, если простое число равно x. Переменная i является делителем.(То есть) x/2, (x/2)-1,...0.

public int primes(int x, int i)
{
    if(i==0)
        return 1;
    if(x%i==0)
        return 0;
    else
        primes(x, i-1);
}

В чем сложность этого кода, если мне пришлось печатать первые 1000 простых чисел.

7 ответов

Решение

В этом случае:

else
    primes(x, i-1);

Вы ничего не возвращаете. Однако компилятор должен гарантировать, что что-то возвращается во всех случаях. Просто верните все, что возвращает рекурсивный вызов метода:

else
    return primes(x, i-1);

Кроме того, измените условие первого случая на i == 1 так что возвращается 1 на простых числах правильно.

На первый взгляд кажется, что вы пропускаете возврат в своем операторе else:

public int primes(int x, int i)
{
    if(i==1)
        return 1;
    if(x%i==0)
        return 0;
    else
        return primes(x, i-1);
}

edit: Также, как сказано в ответе rgettman, в первом условном выражении есть логическая ошибка if(i==0), Так должно быть if(i==1), После тестирования кода с вышеупомянутым редактированием вот мой результат:

List of primes under 100: 
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
import java.util.Scanner;

public class Primenumm {
     public static void main(String[] args) {
          System.out.println("Enter the Number :-");
          Scanner s = new Scanner(System.in);
          int limit = s.nextInt();
          for (int i = limit; i >= 1; i--) {
               if (primes(i, i - 1) == 1) {
                    System.out.println(i + " is a prime no");
               } else {
                    System.out.println(i + " is not a prime no");
               }
          }
     }

     private static int primes(int x, int i) {
          if (i == 1) {
               return 1;
          }
          try {
               if (x % i == 0) {
                    return 0;
               } else {
                    return primes(x, i - 1);
               }
          } catch (Exception e) {
               return 1;
          }
     }
}

Вы можете применить логику как:

for (i = 1; i <= 100; i++) {              
    int counter=0;    
    for (num = i; num>=1; num--) {
        if (i%num==0) {
            counter = counter + 1;
        }
    }
    if (counter == 2) {
        //Appended the Prime number to the String
        primeNumbers = primeNumbers + i + " ";
    }   
}

Затем отобразите primeNumbers,

Вам просто нужно return внутри вашего else,

else
    return primes(x, i-1);

return там будут возвращаться результаты рекурсивных вызовов, и они будут работать в стеке. Хотя это может привести к StackruExceptions.

import java.util.Scanner;
public class Primenumm {

static int limit,flag;

public static void main(String[] args) {
    // TODO Auto-generated method stub

    System.out.println("Enter the Number :-");
    Scanner s=new Scanner(System.in);
    limit=s.nextInt();
    int i=0,j=limit;
    printNum(i,j);
}

private static int  printNum(int i, int j) {
    // TODO Auto-generated method stub

    if(j==0){
        return 1;
    }
    if(i%j==0){
        return  0;
    }
    else{

        return  printNum(i,j-1);
    }
}
public class PrintPrime {

    public static void main(String args[]) {
        for (int i = 2; i < 1000; i++) {
            primes(i, Math.ceil(Math.sqrt(i)));

        }
    }

    public static int primes(int x, double i) {
        if (i == 1)
            System.out.println(x);
        if (x % i == 0)
            return 0;
        else
            return primes(x, i - 1);
    }

}
Другие вопросы по тегам