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