递归和分治

分治( divide and conquer)的全称为“分而治之”,也就是说,分治法将原问题划分成若干个规模较小而结构与原问题相同或相似的子问题,然后分别解决这些子问题,最后合并子问题的解,即可得到为原问题的解。上面的定义体现出分治法的三个步骤:

①分解:将原问题分解为若干和原问题拥有相同或相似结构的子问题。

②解决:递归求解所有子问题。如果存在子问题的规模小到可以直接解决,就直接解决

③合并:将子问题的解合并为原问题的解

需要指出的是,分治法分解出的子问题应当是相互独立、没有交又的。如果存在两个子词题有相交部分,那么不应当使用分治法解决

递归是很适合用来实现分治思想的,下面主要讲解几个案例来深入了解递归和分治:

1.使用递归求解n的阶乘:

(1)程序代码:

#include<cstdio> 
int Func(int n){
	if(n==0) 
		return 1;//设置递归的边界为Func(0)=1; 
	else 
		return Func(n-1)*n;//未到达递归边界事,使用递归式递归 
}
int main(){
	int n;
	scanf("%d",&n);
	printf("%d\n",Func(n));
	return 0;
}

(2)运行结果:

 

2.求斐波那契数列(Fibonacci)的第n项:

1.程序代码:

#include<cstdio> 
int Func(int n){
	if(n==0||n==1) 
		return 1;//设置递归的边界为
	else 
		return Func(n-1)+Func(n-2);//未到达递归边界事,使用递归式递归 
}
int main(){
	int n;
	scanf("%d",&n);
	printf("%d\n",Func(n));
	return 0;
}

2.运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值