繁体   English   中英

尾递归java

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM