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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值