分治( 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.运行结果:

2667

被折叠的 条评论
为什么被折叠?



