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; } }