2015-09-27 95 views
0

我最近了解到尾递归。 据我所知,许多编程语言编译器在发现递归方法为“尾递归”时执行[当前java不],代码优化。Java尾递归:低于斐波那契码尾递归?

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

Java不会为尾递归执行任何代码优化:http://stackoverflow.com/questions/3616483/why-does-the-jvm-still-not-support-tail-call-optimization – Tunaki

回答

0

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

为了证明考虑下面的程序:

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

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

中的StackOverflowError运行此程序的结果,这意味着栈必须填写的东西:堆栈帧!