关于递归函数的替换

在工作中遇到一个算法使用递归实现,算法是用来Check地图上两点是否连通。当两点距离非常远的时候,比如从东北到海南,中间会经过上万个点,这时候递归程序就会崩溃。函数调用的参数是通过栈空间来传递的,在调用过程中会占用线程的栈资源。而递归调用,只有走到最后的结束点后函数才能依次退出,而未到达最后的结束点之前,占用的栈空间一直没有释放,如果递归调用次数过多,就可能导致占用的栈资源超过线程的最大值,从而导致栈溢出,导致程序的异常退出。

于是想到一种递归的替代方法,以斐波纳挈数列示例:

#include<iostream>
bool Fobonaca(unsigned long& cur,unsigned long& next,unsigned long& val);
bool Fobonaca(unsigned long cur,unsigned long next);

//打印函数的调用次数

bool Fobonaca(unsigned long& val);

bool Fibonaca(unsigned long val);
int main()
{
        unsigned long cur = 1;
        unsigned long next = 1;
        unsigned long val = 0;

        while(Fobonaca(cur,next,val))
        {

   //这样就不会导致栈溢出
        };
        char c = getchar();
        Fobonaca(cur,next);

        val = 0;

        while(Fobonaca(val))

        {

                 //可以一直运行到程序设定的返回条件值

        };

        c = getchar();

        Fibonaca(val);   //本人电脑最大值11742就崩溃

        return 0;
}
bool Fobonaca(unsigned long& cur,unsigned long& next,unsigned long& val)
{
        std::cout<<cur<<std::endl;
        val = cur + next;
        cur = next;
        next = val;


        if(cur < 0 || cur > 1<<31)
                return false;
        else
                return true;
}
bool Fobonaca(unsigned long cur,unsigned long next)
{
        std::cout<<cur<<std::endl;
        unsigned long val = 0;
        val = cur + next;
        cur = next;
        next = val;

        if(cur < 0 || cur > 1<<31)
                return true;
        else
        {
                Fobonaca(cur,next);
        }
}

/*

*以下打印函数的调用次数

*/

bool Fobonaca(unsigned long& val)

{

        val++;

        std::cout<<val<<std::endl;

        if(val > (1<<32 - 2))

                return false;

        else

                return true;

}

bool Fibonaca(unsigned long val)

{

        val++;

        std::cout<<val<<std::endl;

        if(val > (1<<32 - 2))

                return true;

        else

                Fibonaca(val);

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值