【问题标题】:Java tail recursion : Is below Fibonacci code tail recursive ?Java尾递归:斐波那契代码尾递归吗?
【发布时间】:2015-09-27 15:16:26
【问题描述】:

我最近了解了尾递归。 我了解,许多编程语言编译器会执行[Current java doesn't] s,当它找到递归方法时会进行代码优化“尾递归”。

我对 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);
    }
}

【问题讨论】:

标签: java fibonacci tail-recursion


【解决方案1】:

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

作为证据考虑以下程序:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-04-02
    • 2015-09-08
    • 2021-11-27
    • 2010-12-03
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多