n选m排列问题的递归算法

n选m经典算法的递归实现,将数据分成两部分,一部分包含某数k,一部分不包含,形成两组m排列,两组m排列由递归分组实现。代码实现的效率不高,希望高手指点。
摘要由CSDN通过智能技术生成

n选m排列是一个经典算法题,如果m = n则称为全排列。

n选m排列问题的递归算法逻辑为:

1,将m个数的排列分为两部分:一部分为包含某个数k(1 <= k <= n)的m排列,一部分为不包含k的m排列;

2,对于包含k的排列,又可以分为两部分:一部分为包含某个数s(k < s <= n)的m-1排列,一部分为不包含s的m-1排列;

3,对于2步所得m-1排列,将k插入到每一个排列中的m个位置可以得到m个新的m排列;

4,同步骤2,对于不包含k的排列可以进行类似的操作,最终将得到所有的n个元素的m排列。


递归算法的伪代码:



Begin:
input m, n;
if m is bigger than n, then set m = n;
if m is smaller than or equal to 0, then return;
if n is smaller than or equal to 0, then return;

PartA: get m permutation contains 1;
PartB: get m permutation not contains 1;

collect two permutations;

End;

PartA:
input k, m, n;
if m is equal to 1, then return 1 permutation only k;

PartA: get m-1 permutation contains k+1;

if m is smaller than (n - k + 1), then:
PartB: get m-1 permutation not contains k+1;

collect two permutation sets in one set;

foreach m-1 permutati
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值