数据结构与算法_递归函数实现整数划分

所求解的问题:
将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1,则n的这种表示称为正整数n的划分。最后求,正整数n的不同划分个数。
例如:6有11种划分方法:
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;
算法实现过程分析:
直接用一个参数难以实现正整数的划分:如,segmentation(n)难以找到递推关系,因此考虑增加一个自变量m。将最大加数(如上面拆分最前面的5,4,3,2,1)记为n1,划分的总数用segmentation(n,m)表示。可以建立如下的递推关系:
(1)segmentation(n,1),即最大的加数为1,划分成上面的1+1+1+1+1+1.只有这一种情况,即n=1+1+1+…+1(n个1相加)。
(2)segmentation(n,m)=segmentation(n,n),m>n时,很明显最大的加数不能大于n。
(3)segmentation(n,n) =1+segmentation(n,n-1),m=n如segmentation(6,6)=segmentation(6,5)+1.正整数n的划分由n1=n和n1<=n-1(n1最大加数)这两部分组成。
a. n=n1只有一种情况:{n},
b.划分中不包含n的情况,即{x1,x2…xi}其中xi均小于n,总共有n-1份划分。
因此得到上边的结论,segmentation(n,n) =1+segmentation(n,n-1)
(4)segmentation(n,m)=segmentation(n,m-1)+segmentation(n-m,m) n>m>1.分两种情况讨论:
a.划分中不包含m的情况,在此情况下划分的所有值都比m小,即n的(m-1)划分,个数为segmentation(n,m-1).
b. 划分中包含m的情况,即{m,{x1,x2…xi}}其中,{x1,x2…xi}的和为n-m.这样理解:seg(6,5),若划分中包含5,则和最大加数相加的是1。因此这种情况下segmentation(n-m,m).
最后得出的递归关系如下:

                                            seg(n,m) =1;                                   n=1||m=1

segmentation(n,m) = seg(n,n) ; n<m;
1+seg(n,m-1) ; n==m
seg(n,m-1) + seg(n-m,m); n>m
代码如下:最后输出一共有多少种划分方式和中间的划分方法。
相信还有很多小伙伴, 没完全明白最常用的return。我顺便写出来,分两种情况。
在函数中,如果碰到return 语句,那么程序就会返回调用该函数的下一条语句执行,也就是说跳出函数的执行,回到原来的地方继续执行下去。但是如果是在主函数中碰到return语句,那么整个程序就会停止,退出程序的执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值