【发布时间】:2014-10-01 11:15:00
【问题描述】:
我正在努力寻找任何给定数字的最大素数。下面的代码适用于大多数数字,直到我输入我想要的数字 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);
}
}
}
【问题讨论】:
-
虽然 Java 确实支持尾递归调用,但我不认为它目前优化了它们。您可以考虑使用memoization。
-
你做的很好,但是你的java编译器没有把尾调用优化成一个循环
标签: java recursion stack-overflow tail-recursion