簡體   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