记一次递归调用问题
2013-12-18 00:00
190 查看
这几天服务器因为一个递归调用导致堆栈溢出,down掉几次!
个人觉得递归调用有时候会存在着隐性的隐患,程序不一定适应所有的数据集,当某个数据集不满足递归结束条件时便容易出现死循环,你不可能枚举所有数据进行测试,这也是我不太钟情于递归的原因。
但是某些情景下你不得不去使用递归,例如在一个文件夹中查找文件,在这个文件夹中有N多个文件夹和文件,这个时候你不知道有多少层文件夹和文件的情况下。
当然递归也存在一定的优点,它让代码更加简洁,缺点就是当递归次数较大时,系统开销也增加。在系统中能用while和for代替的,尽量不要使用递归,我想在不得不使用递归的时候,需要从下面几个方面去避免存在的死循环。
1.代码审查,确认退出递归的出口条件能够实现
2.虽然不知道递归调用的次数,但是可以增加一个上限递归次数与递归结合使用,通常需要与具体的业务结合在一起,譬如递归员工的上级,以某个上限N去限定这个深度,超过这个深度就退出递归,通常这点随需求的变化而变化,敏捷度不高。
总结:能把递归转化为循环的,尽量使用循环实现,实在转不了,结合具体业务分析。
个人觉得递归调用有时候会存在着隐性的隐患,程序不一定适应所有的数据集,当某个数据集不满足递归结束条件时便容易出现死循环,你不可能枚举所有数据进行测试,这也是我不太钟情于递归的原因。
但是某些情景下你不得不去使用递归,例如在一个文件夹中查找文件,在这个文件夹中有N多个文件夹和文件,这个时候你不知道有多少层文件夹和文件的情况下。
当然递归也存在一定的优点,它让代码更加简洁,缺点就是当递归次数较大时,系统开销也增加。在系统中能用while和for代替的,尽量不要使用递归,我想在不得不使用递归的时候,需要从下面几个方面去避免存在的死循环。
1.代码审查,确认退出递归的出口条件能够实现
2.虽然不知道递归调用的次数,但是可以增加一个上限递归次数与递归结合使用,通常需要与具体的业务结合在一起,譬如递归员工的上级,以某个上限N去限定这个深度,超过这个深度就退出递归,通常这点随需求的变化而变化,敏捷度不高。
总结:能把递归转化为循环的,尽量使用循环实现,实在转不了,结合具体业务分析。
相关文章推荐
- java:解决URL.setURLStreamHandlerFactory只能被jvm调用一次的问题
- 8皇后问题 递归 函数调用是重点
- 递归调用过多导致的栈溢出问题说明
- bootstrap-table只能被调用一次的问题
- android webview onJsAlert只调用一次的问题
- 小问题,对递归重复调用的改进,一起来分享
- 递归问题 --自己调用自己
- 记一次thinkphp传到主机 路径无法正常调用的问题
- fork() 调用一次,返回两次的问题。
- 递归、函数的调用机制及汉诺塔问题
- 微信支付仅能成功调用一次的问题
- C#中两个static函数互相递归调用时,递归结果不正确的问题
- 小问题,对递归重复调用的改进,一起来分享
- hanoi塔问题—函数的递归调用
- 函数递归调用问题
- 用C语言解决(hanoi)汉诺塔问题——函数的递归调用
- <C语言>用递归调用函数解决穷举n位二进制数问题
- spring定时器一次调用却触发了两次问题分析
- 递归调用里的性能问题(js)
- android webview onJsAlert只调用一次的问题