尾递归java

时间:2014-08-08 03:25:11

标签: java recursion stack-overflow tail-recursion

我正在努力寻找任何给定数字的最大素数因子。下面的代码适用于大多数数字,直到我输入我想要的数字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);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

首先,在你想要做&的情况下,你在if条件下&&。第二,你的实施是不正确的。尝试在18(最大素数为3)上运行它,并看到它返回9,这显然不是素数。

至于stackoverflow,因为在某些情况下没有限制n > 1的条件,计算将继续-1, -2, -3,...,直到你得到stackoverflow ...

最后,JVM 支持尾递归优化,但即使它确实如此 - 使用迭代解决方案几乎总是更好,因为与递归解决方案不同 - 它没有&# 39;为每个递归调用在堆栈上打开一个新帧(因为没有递归调用 - 它在循环中运行)。

修改

  • 要找到最大的素数因子,您可以从n/2开始,然后向下 (每次迭代减去一次)。
  • 素数p的定义为:p > 1p只能自行划分(和1)。使用此定义并编写迭代方法boolean isPrime(int num)
  • 现在使用前两个项目符号并将它们组合起来编写一个找到最大素数的递归方法。我不想实施它以免破坏你的乐趣:)