关于递归函数的替换
来源:互联网 发布:蓝牙模块和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);
}
- 关于递归函数的替换
- 关于函数的可重入和递归
- 关于C++递归函数的学习总结
- 关于Python函数递归深度的问题
- 关于函数,递归
- 关于不能用replaceAll函数替换换行符的解决办法
- 关于iframe的替换
- 关于UIHelper的两个自动递归获取节点的函数
- 关于UIHelper的两个自动递归获取节点的函数
- python替换的函数
- 关于函数调用和尾递归的一点认识
- [32期] 关于递归函数的数学原理
- 关于递归调用,函数指针,数组,字符串的一些理解
- 数据结构关于树的一些递归函数代码
- Ruby 有关`迭代器' 与 `递归' 的替换.
- 关于“递归”的探讨
- 关于递归的笔记
- 关于递归的问题
- 深入分析 Java 中的中文编码问题
- 复习--F - Earth Hour(最短路,连接1 2 3个点)
- ASP.NET MVC学习---(四)MVC初窥
- R语言的三种聚类方法
- 11462—Age Sort
- 关于递归函数的替换
- Unity3d的IOS平台打包的品质控制
- iOS中多线程原理与runloop介绍
- Oracle Database升级10.2.0.5 to 11.2.0.3
- 值得推荐的技术类微信公众号汇总
- Jquery UI tab 使用注意
- 类的概念,定义,实现
- IOS 自定义UIBUTTON 直接拖个xib 就能在button上显示多行文本 并且添加了点击的效果
- AsyncTask