2012-07-21 108 views
2

这是一个显示尾递归的好例子吗?java中的尾递归

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

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

+12

这是一个更好的例子来显示堆栈溢出:) – dasblinkenlight 2012-07-21 13:57:41

+0

是的,但这将导致无限递归(并在堆栈空间用完时崩溃程序)。 – nhahtdh 2012-07-21 13:57:41

+0

@dasblinkenlight有时我会回来查看您的评论。它永远不会让我振作起来。 – kritzikratzi 2014-02-04 20:42:24

回答

15

否,原因有二:

  • 尾递归是唯一有价值的,当编译器支持它(尾调用优化)。在Java中,它仍然以StackOverflowError

  • 结束,这将很好地显示一些停止条件。你的代码相当于永远循环运行。

考虑斯卡拉几乎相同的代码,唯一的区别是,Scala编译器执行尾调用优化和循环将永远运行下去:

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

我不知道:尾递归只是尾递归。编译器可以对其进行优化,但它不是重点。如我错了请纠正我。 – nhahtdh 2012-07-21 13:59:21

+0

@nhahtdh:OP不问这是否是尾递归(无疑在那)。他问是否这是一个**递归尾巴的好例子**。恕我直言,它不是。 – 2012-07-21 14:02:51

+0

根据[Wikipedia](http://en.wikipedia.org/wiki/Tail_call)和我自己的CS记忆,语言是否特别处理尾递归并不重要 - 该示例是尾递归。 – 2012-07-21 14:03:41

1

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

12

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

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

此例子包括其中递归被终止的重要组成部分。

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