簡體   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