4

这是展示尾递归的好例子吗?

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

我不打算在现实生活中这样做,但我把它作为我考试的一个例子。这是正确的吗?

4

3 回答 3

19

不,有两个原因:

  • 尾递归仅在编译器支持时才有价值(尾调用优化)。在 Java 中,它仍然会以StackOverflowError

  • 显示一些停止条件会很好。您的代码相当于永远循环运行。

考虑 Scala 中几乎相同的代码,唯一的区别是 Scala 编译器执行尾调用优化并且循环永远运行:

def printName() {
  println("Smith"); 
  printName()
}
于 2012-07-21T13:57:44.073 回答
14

尾递归的一个更好的例子是这样的:

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

此示例包括终止递归的重要部分。

除此之外:正如其他答案已经指出的那样:由于Java没有优化尾递归,因此在这种语言中使用它没有意义。所以你基本上最终会自己优化你的算法——通过使其迭代。这就是尾递归的重点:可以证明,任何尾递归算法都可以转换为迭代算法。

于 2012-07-21T14:09:37.653 回答
1

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

于 2012-07-21T13:58:55.140 回答