Java尾部递归:下面是斐波那契代码尾部递归吗?
我最近了解了尾部递归。 我知道,许多编程语言编译器在发现递归方法是“尾部递归”时,会执行[当前java没有]的代码优化 我对TR的理解: 当调用返回后没有要执行的进一步操作时,编译器不会创建新的堆栈帧(而是替换为旧调用的堆栈帧) 下面的代码[即使在java中]是递归的尾部吗 假设TotalSeriesLength=10Java尾部递归:下面是斐波那契代码尾部递归吗?,java,fibonacci,tail-recursion,Java,Fibonacci,Tail Recursion,我最近了解了尾部递归。 我知道,许多编程语言编译器在发现递归方法是“尾部递归”时,会执行[当前java没有]的代码优化 我对TR的理解: 当调用返回后没有要执行的进一步操作时,编译器不会创建新的堆栈帧(而是替换为旧调用的堆栈帧) 下面的代码[即使在java中]是递归的尾部吗 假设TotalSeriesLength=10 public void generateFibonacciSeries(int totalSeriesLenght) { int firstNum = 0; in
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);
}
}
是的,函数调用是尾部递归的,但是Java没有任何尾部调用优化,因此将创建新的堆栈框架 作为证明,考虑以下程序:
public class Test{
public static void main(String[] args){
recursive();
}
public static void recursive(){
recursive();
}
}
运行此程序会导致StackOverflowerError,这意味着堆栈必须填充以下内容:堆栈帧 Java不会对尾部递归进行任何代码优化: