[英]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.