整数分划问题(递归与非递归)

整数分划:

给定一个正整数 n , 一个由 r 个正整数组成的数组 λ = ( x1 , x2, . . . . , xr) 如果满足 x1 + x2 + ··· + xr = n 且 x1 ≥ x2 ≥ ··· ≥ xr ≥ 1, 就称数组 λ 是 n 的一个分划。n 的所有不同的分划的个数记作 p(n)。

比如说 4 的分划 p(4) = 4 :

  4 = 4 ;

  4 = 3 + 1 ;

  4 = 2 + 2 ;

  4 = 2 + 1 + 1 ;

  4 = 1 + 1 + 1 + 1 ;

 我们可以像字典给单词排顺序一样给 n 的所有分划排一个顺序:对于 n 的两个不同的分划 λ = ( x1 , x2, . . . . , xr) 和 μ = ( y1 ,y2, . . . . , ys),如果 λ 的 “首字母” x1 比 μ 的 “首字母” y1 大,就规定在字典序下 λ 比 μ 大,反之则规定 μ 比 λ 大。如果 x1 = y1 ,那么就比较它们的下一个 “字母” x2 和 y2 . . . . 这样继续下去,直到 λ 和 μ 在某一个位置上分出大小,根据这个位置上的大小关系来定义 λ 和 μ 之间的大小关系。在上面的例子中,我们就是按照字典序依次排列的 4 的分划。显然,( n ) 是所有分划中最大的,而 ( 1 , 1 , . . . , 1) 则是所有分划中最小的。这个比较 n 的分划的大小的规则和 C 语言比较字符串大小的规则是一样的。

写程序给定一个整数,输出所有分划。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值