首先来谈谈常规的递归概念,递归递归先递后归。指的是我问你,你问他,他问下一个人这样层层递进直到得知结果并返回的过程。因此递归作为一种算法在程序设计语中广泛应用。 绕口一点来说递归就是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。最基本的递归结构如下:
void countdown(int n)
{
cout << "n is " << n << " addr: "<<&n<< endl;
if (n) //边界条件:终止递归的条件
countdown(n-1);//前进段:递归终止条件不满足时
cout << "n is " << n << " addr: " << &n << endl; //返回段:递归终止条件满足时
}
为了更加深刻的理解递归的过程,我们给传递的变量n取地址并打印,运行结果如下:
根据程序运行的结果来看,递归实际就是压栈出栈的过程,何时压栈何时出栈取决于边界条件的制定,因此当递归缺少边界条件时程序与无限调用,直至当前程序栈全部耗尽,运行强制停止!
我们稍微复杂下,因为当一项工作不断分为两项比较小且类似的工作时,递归的递归的递归的……就是非常好用的一种算法。我们假设有这样一个问题“将刻度尺切割对半并读取切割处的值,在平分刻度尺后在左端和右端继续切割并读值,依次类推”,来看下面的这段代码:
void cut_ruler(double start,double end)
{
double middle_value = (start + end) / 2;
double light_start, light_end;
double right_start, right_end;
light_start = start;//获取左端的起始值
light_end = middle_value;//获取左端的结束值
right_start = middle_value;//获取右端的起始值
right_end = end;//获取右端的结束值
cout << "the light_start:" << light_start << endl;
cout << "the light_end:" << light_end << endl;
cout << "the right_start:" << right_start << endl;
cout << "the right_end:" << right_end << endl;
cout << "the middle:" << middle_value << endl;
cout << endl;
if ((end-start) > 1)//终止条件
{
cut_ruler(light_start, light_end);//左边值,递归前进
cut_ruler(right_start, right_end);//右边值,递归前进
}
cout << "the middle return:" << middle_value << endl;//递归返回
}
我们来看运行结果:
从程序结果可以看出,递归运行时,函数自身将不断调用两个函数自身,形似二叉树的延申过程,同上所述递归经常用于边界与过程都已知的重复计算,类如斐波那契数列,阶乘,网页的前进与返回,arxml,cdd数据库解析等;对了,需要注意一点的是C中main函数自身可以递归,但是C++中不行。好啦,本次递归的原理就说到这里,文中如有错误请各路大佬指点,感兴趣的可以阅读其他更加深入的大佬文章~
声明:本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。