跳到主要内容

递归调用的层次限制

· 阅读需 2 分钟

今天调试一个大程序中出现崩溃的Bug。程序不是我写的,而且崩溃的时候Visual Studio也没有给出调用链,我只好自己去定位bug。最后确定程序是在一个自调用的递归函数中崩溃的。一看到递归函数我就发愁了,它的调用深度可能成百上千,根本没法跟进去确定它崩溃在哪一层。后来经同事提示,我才恍然大悟。因为程序崩溃时Visual Studio给出了错误信息是“Stack Overflow”,所以这里最可能的问题就是递归调用层次过深,导致了栈溢出。

我还是挺喜欢使用递归的,因为写起来简单。今天真正调试了别人的程序才发现它缺点也不少,主要是不容易调试,递归层次较深的时候,很难找出错误出现的那一层。相对来说,循环中找出错误出现在哪一次迭代还是比较容易的。

至于递归深度的限制还是个小问题,如果程序正确,很少有递归需要达到那么深的层次。

我仔细阅读了一遍我调试的那段程序,果然发现它有一个逻辑错误,导致了在特定情况下递归永远达不到截止条件,以至于系统出现栈溢出错误。