【问题标题】:Printing prime numbers in Java using recursion使用递归在Java中打印素数
【发布时间】:2014-09-13 14:35:58
【问题描述】:

我用C写了一个类似的函数,并且能够达到与java不同的所需结果。 下面是代码,它递归地检查一个数字是否是素数。 编译说,我缺少返回声明。 如果素数是 x,则要检查的数字。变量 i 是除数。(ie) 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 个素数,这段代码的复杂度是多少?

【问题讨论】:

  • 对于复杂性,在最坏的情况下,i 一直下降到 0,所以如果 ix/2 开始,它大约是 O(x)。但这将摊销到更小的东西,因为显然不是每个数字都是素数(en.wikipedia.org/wiki/Prime_number_theorem)。对于仅仅 1000 个素数,我怀疑无论如何它会花费很长时间。
  • @Ben 不,它不会摊销到任何更小的东西,因为测试是以错误的顺序完成的。 n=1000 个素数表示要测试的 ~ N=8000 个数字,通过 O(N^2) 算法;不要仅仅因为 n=1000 看起来很小(你确实说过“无论如何”......)而确定它会运行得很快 - 它的复杂性非常糟糕(参见例如这个 Haskell test entry 与显示的等效算法〜 N^2.2 , ~ n^2.5 运行时行为。
  • 我的意思是 OP 的 primes 是 O(x)(或 O(n) 或其他)。所以可以肯定的是,如果他循环它是 O(n^2),但它不会采取绝对最坏的情况,因为 OP 已经声明他从 x/2 开始 i,所以偶数立即失败。然后找到 1000 个素数 x 只需要 7919,因此对于大多数数字来说,素数不会递归很远。
  • @Ben 他们确实谈到了寻找前 1000 个素数。我给你证据表明它比N^2差
  • 算法is ~ n^2.5empirical orders of growth,产生了n个素数。

标签: java recursion primes


【解决方案1】:

在这种情况下:

else
    primes(x, i-1);

你没有返回任何东西。但是,编译器必须确保在所有情况下都返回某些内容。只需返回递归方法调用返回的任何内容:

else
    return primes(x, i-1);

另外,将第一个案例的条件修改为i == 1,这样它就可以正确返回素数上的1

【讨论】:

  • 像魅力一样工作。从 C 到 Java 的转换是罪魁祸首!
【解决方案2】:

乍一看,您的 else 语句中似乎缺少 return:

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

编辑:另外,正如 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

【讨论】:

    【解决方案3】:

    您只需要在您的else 中添加一个return

    else
        return primes(x, i-1);
    

    那里的return 将返回递归调用的结果,并且它们将在堆栈中向上工作。不过,这可能会导致StackOverflowExceptions。

    【讨论】:

      【解决方案4】:
      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;
                }
           }
      }
      

      【讨论】:

        【解决方案5】:

        您可以将逻辑应用为:

        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

        【讨论】:

          【解决方案6】:
          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);
              }
          
          }
          

          【讨论】:

            【解决方案7】:
            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);
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-04-02
              • 2020-06-07
              • 2016-05-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-03-10
              • 1970-01-01
              相关资源
              最近更新 更多