1 void PrintList(List L) 2 { 3 if(L!=Null) 4 { 5 PrintElement(L->Element); 6 PrintLisr(L->Next); 7 } 8 } 9
所謂尾遞歸,就是在函數的最後一行調用原函數,進行遞歸。這個方法是徹底合法的,可是存在一個問題。函數在調用自身進行遞歸的時候,包括調用的時候的入口,每個函數的局部變量都是須要保存在寄存器中的,而後會以抽象的方式保存在堆頂部。這一些的工做都是由一個棧來完成,所儲存的的信息被稱爲活動記錄,或叫作棧幀。若是遞歸的次數太多,就有可能致使棧空間被用盡,這是一個致命的錯誤,程序有可能奔潰而沒有明顯的說明。函數
能夠用goto 代替尾遞歸防止這種現象spa
void PrintList(List L) { top: if(L!=Null) { PrintElement(L->Element); goto top; } }