簡體   English   中英

java中的尾遞歸

[英]Tail Recursion in java

這是顯示尾遞歸的一個很好的例子嗎?

public printName(){
    System.out.println("Smith");
    printName();
}

我不打算在現實生活中這樣做,但我把它作為我考試的一個例子。 這是正確的嗎?

不,有兩個原因:

  • 尾遞歸僅在編譯器支持它時才有價值( 尾調用優化 )。 在Java中,它仍將以StackOverflowError結束

  • 顯示一些停止條件會很好。 您的代碼相當於永遠循環運行。

考慮Scala中幾乎相同的代碼,唯一的區別是Scala編譯器執行尾調用優化並且循環永遠運行:

def printName() {
  println("Smith"); 
  printName()
}

尾遞歸的一個更好的例子是這樣的:

public printName(int level){
    if( level <= 0 )
         return;
    System.out.prntln("Smith");
    printName(--level);
}

此示例包括終止遞歸的重要部分。

除此之外:正如其他答案已經指出的那樣:由於Java不優化尾遞歸,因此在這種語言中使用它沒有任何意義。 所以你基本上最終會自己優化你的算法 - 通過迭代。 這就是尾遞歸的要點:可以證明,任何尾遞歸算法都可以轉換為迭代算法。

我會說這是尾遞歸的一個例子,因為你在程序的尾部遞歸:)但我不認為JVM會優化它,這可能是你想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM