尽量用goto代替尾递归

 

1 void PrintList(List L)
2 {
3     if(L!=Null)
4     {
5        PrintElement(L->Element);
6        PrintLisr(L->Next);
7     }               
8 }               
9     

 

 所谓尾递归,就是在函数的最后一行调用原函数,进行递归。这个方法是完全合法的,但是存在一个问题。函数在调用自身进行递归的时候,包括调用的时候的入口,每一个函数的局部变量都是需要保存在寄存器中的,然后会以抽象的方式保存在堆顶部。这一些的工作都是由一个栈来完成,所储存的的信息被称为活动记录,或叫做栈帧。如果递归的次数太多,就有可能导致栈空间被用尽,这是一个致命的错误,程序有可能奔溃而没有明显的说明。

  可以用goto 代替尾递归防止这种现象

void PrintList(List L)
{
    top:
    if(L!=Null)
    {
        PrintElement(L->Element);
        goto top;
    }
}

 

posted @ 2016-03-30 19:42  深空灰  阅读(863)  评论(1编辑  收藏  举报