关于递归函数的替换

来源:互联网 发布:蓝牙模块和51单片机 编辑:程序博客网 时间:2024/06/06 00:12

在工作中遇到一个算法使用递归实现,算法是用来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 0