189 8069 5689

C++递归使用

 首先来谈谈常规的递归概念,递归递归先递后归。指的是我问你,你问他,他问下一个人这样层层递进直到得知结果并返回的过程。因此递归作为一种算法在程序设计语中广泛应用。 绕口一点来说递归就是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。最基本的递归结构如下:

成都创新互联技术团队十余年来致力于为客户提供网站制作、网站建设、品牌网站设计营销型网站、搜索引擎SEO优化等服务。经过多年发展,公司拥有经验丰富的技术团队,先后服务、推广了千余家网站,包括各类中小企业、企事单位、高校等机构单位。

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++中不行。好啦,本次递归的原理就说到这里,文中如有错误请各路大佬指点,感兴趣的可以阅读其他更加深入的大佬文章~
  


网站栏目:C++递归使用
标题网址:http://cdxtjz.cn/article/dsoigss.html

其他资讯