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