[英]Tail Recursion java
我正在尋找任何給定數字中最大的素數。 下面的代碼適用於大多數數字,直到我輸入所需的數字600851475143。執行此操作后,我會得到堆棧溢出。 我一直在閱讀尾遞歸,據我所知,我應該正確地實現它。 但是,盡管如此,我仍然收到堆棧溢出錯誤。 實施尾遞歸時,我哪里出錯了?
import java.util.Scanner;
public class LargestPrimeFactor
{
static long number;
static long answer;
public static void main(String[] args)
{
System.out.println( "Enter number to find its largest prime factor");
Scanner input = new Scanner(System.in);
number = input.nextLong();
answer = largestPrime(number);
System.out.println("The largest prime of " + number + " is " + answer);
}
private static long largestPrime(long n)
{
n = n-1;
if(n % 2 != 0 & number % n == 0 )
{
return n;
}
else
{
return largestPrime(n);
}
}
}
首先,在if條件下,您正在做&
,而您可能打算做&&
。 其次,您的實現不正確。 嘗試在18(最大質數為3)上運行它,並查看返回的9
顯然不是質數。
至於stackoverflow,由於在某些情況下沒有限制n > 1
條件,計算將繼續為-1, -2, -3,...
直到得到stackoverflow...。
而在去年,該JVM 不支持尾遞歸優化,但即使做了-你幾乎永遠是更好地與迭代求解,因為不像遞歸解決方案-它不會打開堆棧上一個新的框架,每遞歸調用(因為沒有遞歸調用-它在循環中運行)。
編輯
n/2
開始然后向下(每次迭代減一)。 p
的定義是: p > 1
並且p
只能除以自身(和1
)。 使用此定義並編寫一個迭代方法boolean isPrime(int num)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.