我正在努力寻找任何给定数字的最大素数因子。下面的代码适用于大多数数字,直到我输入我想要的数字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);
}
}
}
答案 0 :(得分:3)
首先,在你想要做&
的情况下,你在if条件下&&
。第二,你的实施是不正确的。尝试在18(最大素数为3)上运行它,并看到它返回9
,这显然不是素数。
至于stackoverflow,因为在某些情况下没有限制n > 1
的条件,计算将继续-1, -2, -3,...
,直到你得到stackoverflow ...
最后,JVM 不支持尾递归优化,但即使它确实如此 - 使用迭代解决方案几乎总是更好,因为与递归解决方案不同 - 它没有&# 39;为每个递归调用在堆栈上打开一个新帧(因为没有递归调用 - 它在循环中运行)。
修改强>
n/2
开始,然后向下
(每次迭代减去一次)。p
的定义为:p > 1
和p
只能自行划分(和1
)。使用此定义并编写迭代方法boolean isPrime(int num)