分治法求最近点对中关于递归的收获

本文分享了作者在解决HDUQuoitDesign问题时遇到的栈溢出错误,并详细记录了从发现问题、分析问题到最终解决问题的全过程。通过调整递归函数中的内存分配方式,成功解决了栈溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做HDU Quoit Design时,一开始直接暴力求解,submit,果然Time Limit Exceeded。在百度了之后,看到大神们都是使用分治的方法来求解这个最近点对问题。参考了别人的思路,原文链接:http://blog.youkuaiyun.com/sd6264456/article/details/9318861。里面有很详细的分析和源代码,对解这题很有帮助。多理解掌握分治算法也有帮助。

在仔细阅读了该文章之后,我自己动手写了解题的代码。在测试了几个简单的用例成功之后,自信满满的submit,结果出乎意料Wrong Answer

 

随后我仔细分析调试自己的代码,甚至对比着该文中的代码进行分析,始终没发现问题所在。

随后,我没办法增加了测试用例的复杂度,使得点的数量增加,这次终于不一样,编译器弹出Stack overflow的错误。这是栈溢出啊,可是在哪里溢出的呢?一般的栈溢出都是递归没有出口,使得无限递归下去,导致栈溢出。可是我的递归出口很明显啊,不会是没出口啊。

那为什么无限递归会导致栈溢出呢?因为无限递归下去,栈的存储有限,就会有溢出的时候。那我的递归是不是也使得栈的存储空间爆满?

我的代码中,在递归函数里面定义了一个占用内存很大数组,这是一个局部变量,每次进入递归都要分配一次内存空间,着就使得栈溢出。然后我将这行数组定义语句移到了递归之后,虽然还是在递归函数里面,但是只有当所有的递归都返回之后才可能执行到这条语句,即这个内存分配语句只在第一递归的时候会执行。

再次测试复制的用例,结果还是stack overflow,一脸mengbi。难道在递归的时候,那次递归函数的执行,都会分配所有可能需要用到的空间?

最后,实在没办法,把这个数组定义为全局变量。submit,Accepted

收获就是,以后写递归,一定要记住内存空间的分配语句,如果不是必须的局部变量,不论在递归中会不会执行到,都应该放到递归函数外面!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值