这是一个展示尾递归的好例子吗?
public printName(){
System.out.println("Smith");
printName();
}
我并不打算在现实生活中这样做,但是我把这个作为我的考试例子。这个例子正确吗?
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不会优化尾递归,在这种语言中使用尾递归没有意义。因此,您基本上需要通过使其成为迭代算法来优化自己的算法。这就是尾递归的关键:可以证明,任何尾递归算法都可以转换为迭代算法。