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