儘可能用goto代替尾遞歸

 

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;
    }
}
相關文章
相關標籤/搜索