常用算法思想复习之<递归与分治>

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 }

 

posted @ 2012-03-02 10:14  landy聪  阅读(281)  评论(0编辑  收藏  举报