Java尾部递归:下面是斐波那契代码尾部递归吗?

Java尾部递归:下面是斐波那契代码尾部递归吗?,java,fibonacci,tail-recursion,Java,Fibonacci,Tail Recursion,我最近了解了尾部递归。 我知道,许多编程语言编译器在发现递归方法是“尾部递归”时,会执行[当前java没有]的代码优化 我对TR的理解: 当调用返回后没有要执行的进一步操作时,编译器不会创建新的堆栈帧(而是替换为旧调用的堆栈帧) 下面的代码[即使在java中]是递归的尾部吗 假设TotalSeriesLength=10 public void generateFibonacciSeries(int totalSeriesLenght) { int firstNum = 0; in

我最近了解了尾部递归。 我知道,许多编程语言编译器在发现递归方法是“尾部递归”时,会执行[当前java没有]的代码优化

我对TR的理解: 当调用返回后没有要执行的进一步操作时,编译器不会创建新的堆栈帧(而是替换为旧调用的堆栈帧)

下面的代码[即使在java中]是递归的尾部吗

假设TotalSeriesLength=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);
    }
}

是的,函数调用是尾部递归的,但是Java没有任何尾部调用优化,因此将创建新的堆栈框架

作为证明,考虑以下程序:

public class Test{
  public static void main(String[] args){
    recursive();
  }

  public static void recursive(){
    recursive();
  }
}

运行此程序会导致StackOverflowerError,这意味着堆栈必须填充以下内容:堆栈帧

Java不会对尾部递归进行任何代码优化: