繁体   English   中英

JAVA中质数的递归方法

[英]Recursive method for prime numbers in JAVA

首先,我知道这是一个简单的问题,我是一个初学者,所以请多多包涵。 我在使用Java进行此练习时遇到了问题,并且正在练习进行测试,而这真的使我的自信心一团糟。 所以无论如何问题看起来像这样

 // Returns true if (and only if) n is a prime number;  n > 1 is assumed.
private static boolean isPrime(long n) {
    return isPrime(n, 2);
    // See the method isPrime below.
}

// Helper method for isPrime ...
private static boolean isPrime(long n, long m) {
    return (m * n > (m /* TODO: modify expression if necessary */))
            || (n % m == (0 /* TODO: modify expression if necessary */)
                && isPrime((m /* TODO: modify expression if necessary */), n + 1));
}

因此,您应该将这些表达式填充在TODO所在的括号内。 我的问题是我无法跟踪它的作用。

isPrime((.....),n+1); 

如果有人能就如何开始解决这个问题提供一些建议,我将不胜感激。

此问题不适用于递归解决方案。 或至少不是有效的递归解决方案。

素数的定义是,如果N不能被除其本身或1以外的任何正整数整除,则N是素数。使用递归处理该素的正常方法是定义一个递归“ is_divisible”函数:

# for integers m >= 1
is_prime(m):
    return is_divisible(m, 1)

is_divisible(m, n):
    if n >= m: return true
    if n == 1: return is_divisible(m, n + 1)
    if m % n == 0: return false  // HERE
    return is_divisible(m, n + 1)

或(更有效的三参数版本)

# for all integers m
is_prime(m):
    if m == 1: return false
    if m >= 2: return is_divisible(m, sqrt(m), 2)
    error "m is not a positive integer"

is_divisible(m, max, n) :
    if n >= max: return true
    if m % n == 0: return false  // HERE
    return is_divisible(m, max, n + 1)

(在文献中,它们经常调用is_divisible “辅助”函数之类的函数。这是函数编程中的常用工具。)

如果尝试“优化”以仅在HERE考虑素数,则最终将导致双重递归..和指数复杂性。


这在Java中都是非常“不自然的”,并且效率极低(甚至与使用循环1进行的朴素素性测试相比),因为Java不会对递归进行尾部优化。 实际上,对于足够大的N您将得到一个StackOverflowError


1-一种更好但仍然简单的方法是Erathones筛网。 有比原始性更好的测试,尽管它们相当复杂,并且在某些情况下是概率性的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM