[英]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.