我最近了解了尾递归。 据我所知,许多编程语言编译器执行[当前java没有],代码优化时发现递归方法为“Tail递归”。
我对TR的理解: 当调用返回后没有进一步的操作时,编译器不会创建新的堆栈帧(而是用旧调用的堆栈帧替换)。
下面的代码[即使在java中]尾部是递归的吗?
假设totalSeriesLenght = 10。
public void generateFibonacciSeries(int totalSeriesLenght) {
int firstNum = 0;
int secondNum = 1;
printNextFibonacciNumber(firstNum, secondNum,totalSeriesLenght);
}
public void printNextFibonacciNumber(int fiboOne , int fiboTwo,int totalSeriesLenght) {
if(totalSeriesLenght >= 1) {
System.out.print(fiboOne + ",");
int fiboNext = fiboOne + fiboTwo;
totalSeriesLenght --;
printNextFibonacciNumber(fiboTwo, fiboNext,totalSeriesLenght);
}
}
答案 0 :(得分:1)
是函数调用是尾递归的,但Java没有任何尾调用优化,因此将创建新的堆栈帧。
作为证据考虑以下程序:
public class Test{
public static void main(String[] args){
recursive();
}
public static void recursive(){
recursive();
}
}
运行此程序会导致StackOverflowError,这意味着堆栈必须填充一些东西:堆栈帧!