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