算法设计与分析笔记-递归与分治

本文介绍了算法设计中的递归与分治策略。分治法将大问题分解为小问题,递归则是解决问题的一种手段,需要有边界条件和递归返回段。文章通过正整数划分和棋盘覆盖问题展示了分治法的应用,并提到了快速排序作为分治策略的例子。递归虽然直观,但可能导致效率低下和堆栈溢出。
摘要由CSDN通过智能技术生成

在这里插入图片描述
概念:
任何一个可以用计算机求解的问题所需的计算时间都与其规模n有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
如果原问题可分割成k个子问题(1<k≤n),且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。
由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这里插入图片描述
递归需要有边界条件、递归前进段和递归返回段。
当边界条件不满足时,递归前进;
当边界条件满足时,递归返回。
注意:在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口,否则将无限进行下去(死锁)。
递归的缺点:
递归算法解题的运行效率较低。
在递归调用过程中,系统为每一层的返回点、局部变量等开辟了堆栈来存储。递归次数过多容易造成堆栈在这里插入图片描述
溢出等。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
//产生从元素k~m的全排列,作为前k—1个元素的后缀

void Perm(int list[], int k, int m)
{
   
	if(k==m) 	//构成了一次全排列,输出结果
	{
   
		for(int i=0;i<=m;i++)
			cout<<list[i]<<" ";
		cout<<endl;
	}
	else
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值