排列组合问题(递归实现)

  在做递归问题时,要保证对递归跳跃的信任,继而对相应的问题寻找其递归实现

(1)组合:先从原始数组中选择一个,再从剩下的集合中选择m-1个;而后,再从剩下的集合中挑选m个元素。

 

/*组合代码(eg:5选2)*/
int a[5]={1,2,3,4,5};//原始数组
int b[2];//挑选的结果
const int need=2;//需要选择的个数
void combine(int start,int end,int x)
{
    if(x==need)
    {
        //(1)打印组合的内容
        for(int i=0;i<need;i++)
        {
            cout<<b[i]<<" ";
        }
        cout<<endl;
        //(2)对每一种组合进行排列
        //permute(b,0,2);//见下
        return;
    }
    if((end-start)<(need-x))//如果剩下的元素个数<需要的数
    {
        return;
    }
    b[x]=a[start];//先选择一个
    combine(start+1,end,x+1);//再从剩下的集合中选择m-1个
    combine(start+1,end,x);//然后再从剩下的集合(即缩小的集合中选择m个)
    
}

(2)排列:为了列出一个长度为n的字符串的所有排列,可以一次挑选n个字母中的一个;然后在后面列出其余的n-1个字母可能的排列组合。

     

/*排列函数*/
/*参数:c     为 int 型数组的地址
       start 为排列数组的起始下标
       end   为排列数组的结束下标+1
*/
void permute(int c[],int start,int end)
{
    if(start==end) //挑选完毕
    {
        /*打印数组*/
        for(int i=0;i<end;i++)
        {
            cout<<c[i]<<" ";
        }
        cout<<endl;
     }
    else
    {
        for(int i=start;i<end;i++)
        {
            swap(c[i],c[start]);//一次挑选n个字母中的一个
            permute(c,start+1,end);//再对其余的n-1个字母一次挑选
            swap(c[i],c[start]);//恢复原字符串

        }
    }
}                                     

问题牵引:在对字符数组进行排序的时候,应当注意传入参数的方式,即 char str[] 和 char * str的区别

    (1)char * str 的str,指向一块内存区域,可以随时改变;但其指向的内容不可以修改

    (2)char str[] 其地址不可改变,即常量指针;但数组内容可以改变

转载于:https://www.cnblogs.com/ackhan/p/3770077.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值