2015-09-27 5 views
0

Я недавно узнал о рекурсии хвоста. Я понимаю, что многие компиляторы языка программирования выполняют [Current java is not] s, оптимизируют код, когда он находит рекурсивный метод «Рекурсивный хвост».Рекурсия хвоста Java: ниже рекурсивного кода хвоста Фибоначчи?

Мое понимание ТР: Компилятор не создает новый стек кадров (вместо этого заменяет собой стек стека старого вызова), если после завершения вызова не будет выполняться никаких дальнейших операций.

Под кодом [хотя в 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, что означает, что стек должен быть заполнен чем-то: кадры стека!