Печать простых чисел в 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
там будут возвращаться результаты рекурсивных вызовов, и они будут работать в стеке. Хотя это может привести к StackruException
s.
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);
}
}