Java尾递归:Fibonacci下面的代码尾递归吗?

时间:2015-09-27 15:16:26

标签: java fibonacci tail-recursion

我最近了解了尾递归。 据我所知,许多编程语言编译器执行[当前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);
    }
}

1 个答案:

答案 0 :(得分:1)

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

作为证据考虑以下程序:

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

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

运行此程序会导致StackOverflowError,这意味着堆栈必须填充一些东西:堆栈帧!