更多文章
更多精彩文章![](https://imgs0.zupu.cn/photos/common/20210831/415276d3-6828-4a6c-84e5-dfa66e230bf3.png)
递归溢出
无限递归
无限递归是堆栈溢出的最常见原因,如以下的C/C++语言程序会产生堆栈溢出:
intfoo(){returnfoo();//這裡出現自我呼叫}
然而有些语言(如Scheme)支持尾部递归优化,在这些语言中只有一般递归会产生堆栈溢出,而尾部递归不会:
(define (foo)(foo))(define (foo)(+ (foo)1))
这段代码中,前者(第一句)进入死循环(Infinite loop),但不会产生堆栈溢出;后者(第二句)则会产生堆栈溢出。
防止堆栈溢出
多数无限递归出现原因,都是基于程序本身没有错误检测机制:
intfactorial(constint*constn){if(*n==0)return1;elsereturn*n*factorial(*n--);//這裡出現自我呼叫};
如果在这里的 n 是负数则会出现无限递归。其实,这段程序可以简单地加以修改,把 n 的类型由整数改为非负整数即可解决:
unsignedintfactorial(constunsignedint*constn){if(*n==0)return1;elsereturn*n*factorial(*n--);};
或者使用循环处理:
unsignedintfactorial(constunsignedint*constn){unsignedinti,result;for(i=*n,result=1;i>0;--i)result*=i;//自我呼叫部份改為迴圈處理returnresult;};
参看
溢出
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
{{item.time}} {{item.replyListShow ? '收起' : '展开'}}评论 {{curReplyId == item.id ? '取消回复' : '回复'}}