JAVA中素数的递归方法

JAVA中素数的递归方法,java,recursion,boolean,Java,Recursion,Boolean,首先,我知道这是一个简单的问题,我是一个初学者,所以请容忍我。 我在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

首先,我知道这是一个简单的问题,我是一个初学者,所以请容忍我。 我在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是素数。处理使用递归的正常方法是定义一个递归的“可除”函数:

# 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)
或(更高效的3参数版本)

(在文献中,他们通常将
等函数称为“辅助”函数。这是函数编程中的常用工具。)

如果你试图“优化”,只考虑素数在<代码>这里/代码>,你将得到双递归。指数复杂性


这在Java中是非常“不自然”的,而且效率极低(甚至与使用loop1的朴素素性测试相比),因为Java不进行递归的尾部调用优化。实际上,对于足够大的
N
,您将得到一个
堆栈溢出错误



1-一种更好但仍然简单的方法是对埃拉通进行筛选。素数测试比素数测试更好,尽管它们相当复杂,而且在某些情况下是概率的。

如果一个数字只能被1和它本身整除,那么它就是素数。补充说明是,如果它能被任何其他素数平均整除(即模返回0),它就不是素数。应该有助于思考这个问题。是的,我理解,问题是如果数字是素数,那么方法应该返回true,并且n%m==0的条件仅对非素数为true。因此,如果n是一个将为false的素数,false&&true仍然为false。
isPrime((m/*TODO:modify expression if needly*/),n+1))
正在检查除数
m
的素性,而不是
n
。如果
m
不是素数,
n
不是素数。因此,如果我们以
n=7
为例,当方法第一次调用自身时,m参数是8?我明白你的意思,但我不完全确定答案是什么,因为这是一种奇怪的递归方式。通常你会用
isPrime(n,m+1)
递归,但你的问题会将
m
n
转换。我们能只用两个参数来做吗?用m/2代替max
是可除的(m,n):-如果n>=m/2:如果n==1,则返回true:如果m%n==0,则返回可除的(m,n+1):返回false//这里返回是可除的(m,n+1)
-类似这样的情况?对于3参数版本,您应该使用
sqrt(m)
作为“最大值”。同样的优化也适用于naive循环和筛选算法。
# 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)