void PrintList(List L)
{
if(L!=Null)
{
PrintElement(L->Element);
PrintLisr(L->Next);
}
}
所谓尾递归,就是在函数的最后一行调用原函数,进行递归。这个方法是完全合法的,但是存在一个问题。函数在调用自身进行递归的时候,包括调用的时候的入口,每一个函数的局部变量都是需要保存在寄存器中的,然后会以抽象的方式保存在堆顶部。这一些的工作都是由一个栈来完成,所储存的的信息被称为活动记录,或叫做栈帧。如果递归的次数太多,就有可能导致栈空间被用尽,这是一个致命的错误,程序有可能奔溃而没有明显的说明。
可以用goto 代替尾递归防止这种现象
void PrintList(List L)
{
top:
if(L!=Null)
{
PrintElement(L->Element);
goto top;
}
}