关闭

整数划分定义与解析(递归)

标签: 递归解析
146人阅读 评论(0) 收藏 举报
分类:

1.背景:整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。
2.定义:所谓整数划分,是指把一个正整数n写成如下形式:
n=m1+m2+…+mi; (其中mi为正整数,并且1 <= mi <= n),则{m1,m2,…,mi}为n的一个划分。
如果{m1,m2,…,mi}中的最大值不超过m,即max(m1,m2,…,mi)<=m,则称它属于n的一个m划分。这里我们记n的m划分的个数为F(n,m);
例如当n=4时,他有5个划分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};
注意4=1+3 和 4=3+1被认为是同一个划分。
该问题是求出n的所有划分个数,即f(n, n)。下面我们考虑求f(n,m)的方法;
3.递归法:
根据n和m的关系,考虑以下几种情况:
(1)当n=1时,不论m的值为多少(m>0),只有一种划分即{1};
(2)当m=1时,不论n的值为多少,只有一种划分即n个1,{1,1,1,…,1};
(3) 当n=m时,根据划分中是否包含n,可以分为两种情况:
(a). 划分中包含n的情况,只有一个即{n};
(b). 划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有(n-1)划分。
因此 F(n,n) =1 + F(n,n-1);
(4) 当n

—————上半部分转载自http://blog.csdn.net/niushuai666/article/details/6600977

4.解析:
当n=6的时候
{6}
{5,1}
{4,2}{4,1,1}
{3,3}{3,2,1}{3,1,1,1}
{2,2,2}{2,2,1,1}{2,1,1,1,1}
{1,1,1,1,1,1}
总共11种划分方法;
程序第一步调用F(6,6):这个时候将整数的划分数目为1(即{6})+F(6,5);//第一步作用将{6}集合与6的5划分分开
程序第二步调用F(6,5):这个时候此部分的划分数目为F(1,5)(即{5,1})+F(6,4);//第二步作用将{5,1}集合与6的4划分分开
程序第三步调用F(6,4):这个时候此部分的划分数目为F(2,2)(即{4,2}{4,1,1})+F(6,3);//第三步将{4,2}{4,1,1}集合与6的3划分分开

程序第六步调用F(6,1):满足条件if(n==1||m==1)直接return 1;
///////////////////////////////////////////////////////
//
//注:由此看出F(n-m, m)与F(n,m-1)两个函数的作用
// F(n,m-1)的作用是逐步递归,使其逐步接近终点
// F(n-m, m)的作用是对6的5划分中的第5行、6的4划分中的第4行
// 等进行排序
// 例:6的4划分的第4行是{4,2}{4,1,1},即F(2,2)是
// {2}{1,1}
// 于是便通过一个递归函数从复杂至简单,一个每行排序的函数,
// 从6->5->4->3->2->1一直排序得出最终的结论,11种
//
///////////////////////////////////////////////////////

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1965次
    • 积分:103
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条
    文章存档