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不优化尾递归,因此在这种语言中使用它是没有意义的。 所以你基本上最终会自己优化你的算法 - 通过迭代。 这就是尾递归的要点:可以certificate,任何尾递归算法都可以转换为迭代算法。

我会说这是尾递归的一个例子,因为你在程序的尾部递归:)但我不认为JVM会优化它,这可能是你想要的。