这是一个显示尾递归的好例子吗?java中的尾递归
public printName(){
System.out.println("Smith");
printName();
}
我不打算在现实生活中这样做,但我把这作为我的考试的一个例子。这是正确的吗?
这是一个显示尾递归的好例子吗?java中的尾递归
public printName(){
System.out.println("Smith");
printName();
}
我不打算在现实生活中这样做,但我把这作为我的考试的一个例子。这是正确的吗?
否,原因有二:
尾递归是唯一有价值的,当编译器支持它(尾调用优化)。在Java中,它仍然以StackOverflowError
结束,这将很好地显示一些停止条件。你的代码相当于永远循环运行。
考虑斯卡拉几乎相同的代码,唯一的区别是,Scala编译器将执行尾调用优化和循环将永远运行下去:
def printName() {
println("Smith");
printName()
}
我不知道:尾递归只是尾递归。编译器可以对其进行优化,但它不是重点。如我错了请纠正我。 – nhahtdh 2012-07-21 13:59:21
@nhahtdh:OP不问这是否是尾递归(无疑在那)。他问是否这是一个**递归尾巴的好例子**。恕我直言,它不是。 – 2012-07-21 14:02:51
根据[Wikipedia](http://en.wikipedia.org/wiki/Tail_call)和我自己的CS记忆,语言是否特别处理尾递归并不重要 - 该示例是尾递归。 – 2012-07-21 14:03:41
我会说这是尾的一个例子递归,因为你在程序尾部递归:)但是我不认为JVM会优化这个,这可能是你想要的。
尾递归的更好的例子是这样的:
public printName(int level){
if(level <= 0)
return;
System.out.prntln("Smith");
printName(--level);
}
此例子包括其中递归被终止的重要组成部分。
除此之外:由于其他答案已经提到:由于Java没有优化尾递归,所以在这种语言中使用它没有意义。所以你基本上最终会自己优化你的算法 - 通过迭代。这就是尾递归的一点:可以证明,任何尾递归算法都可以转化为迭代算法。
这是一个更好的例子来显示堆栈溢出:) – dasblinkenlight 2012-07-21 13:57:41
是的,但这将导致无限递归(并在堆栈空间用完时崩溃程序)。 – nhahtdh 2012-07-21 13:57:41
@dasblinkenlight有时我会回来查看您的评论。它永远不会让我振作起来。 – kritzikratzi 2014-02-04 20:42:24