簡體   English   中英

Java尾部遞歸:在Fibonacci代碼下面是否尾部遞歸?

[英]Java tail recursion : Is below Fibonacci code tail recursive ?

我最近了解了尾遞歸。 我了解,許多編程語言編譯器在找到遞歸方法“尾遞歸”時會執行代碼優化。

我對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沒有任何尾部調用優化,因此將創建新的堆棧框架。

作為證明,請考慮以下程序:

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

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

運行該程序會導致StackOverflowError,這意味着堆棧中必須填充某些東西:堆棧框架!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM