1、概述
在解决一些复杂问题,特别是解决一些规模较大的问题时,常常将问题进行分解。具体来说,
就是将一个规模较大的问题分割成规模较小的同类问题,然后将这些小的问题逐个加以解决,
最终也就将整个大的问题解决了。这种分而治之的思想称为分治的思想。
所谓递归算法,就是一种直接或间接地调用原算法本身的一种算法。递归与分治的算法思想
往往相伴而生。
2、问题实例
例:求正整数不同的划分个数。
1)问题解释:将一个正整数n表示成一系列正整数之和:
n=n1+n2+......+nk
称为正整数n的一个划分。求正整数n的不同划分个数。
2)问题分析
根据正整数划分的定义,可以总结出一下规律:
设标记P(n,m)表示正整数n的所有不同划分中,最大加数不大于m的划分个数。
如:p(6,2)表示6的最大加数不大于2的所有划分
p(n,1)=1, n>=1;
正整数n的划分中加数不大于1的划分数只有一种
p(n,m)=p(n,n), m>=n;
不存在最大加数大于n的正整数n的划分
p(n,n)=p(n,n-1)+1
最大加数为n的正整数n的划分只有一种
p(n,m)=p(n,m-1)+p(n-m,m), n>m>1;
p(n,m)=p(n,m-1)+n的最大加数为m的划分个数
n的最大加数为m的划分个数记为:q(n,m)
则q(n,m)=p(n-m,m),因为n-m的划分的个数决定了q(n,m)的
划分个数,又q(n,m)中最大加数为m所以n-m的划分中最大加数
也为m。故q(n,m)=p(n-m,m),即,p(n,m)=p(n,m-1)+p(n-m,m)
根据以上规律可以写出递归程序:
View Code
1 int P(int n, int m)
2 {
3 if(m==1 || n==1) return 1;
4 if(m>n) return P(n,n);
5 if(m==n) return P(n,m-1)+1;
6 return P(n,m-1)+P(n-m,m);
7
8 }