• 用递归写排列组合问题


    最近递归弄的人头疼,但是这两天看过来也稍微总结了一些不能称得上是技巧的技巧吧

    问题如下,将1,2,3,4这四个数字排列组合的输出来,看网上有个很二的方法吧,就是将10000以内的数全部输出再筛选,对此有点无语,但是程序倒是挺好编的,嘿嘿

    回归到正题中,用递归的思想解决

    (1)采用旋转数字的方法,当步长为1时,1234还是1234,步长为2的时候,1234可以变为1243、1324...,步长为3 的时候,1234可以变为1423,诸如此类,最重要的能体现递归的就是将每次递归一次的数字还可以接着旋转。

    #include<stdio.h>
    void output(int *p,int count)
    {
    for(int j=0;j<count;j++)
    {
    printf("%d",p[j]);
    }
    printf(" ");
    }
    void DifferentSort(int *p,int j,int count)
    {
    if(j<count-1)
    {
    for(int i=j;i<count;i++)
    {
    int temp=p[i];
    for(int k=i;k>=j;k--)
    {
    p[k]=p[k-1];
    }
    p[j]=temp;
    DifferentSort(p,j+1,count);
    int temp1=p[j];
    for(int k1=j;k1<i;k1++)
    {
    p[k1]=p[k1+1];
    }
    p[i]=temp1;
    }
    }
    else
    {
    output(p,count);
    }
    }
    void main()
    {
    int *p=new int ;
    p[0]=1;
    p[1]=2;
    p[2]=3;
    p[3]=4;
    DifferentSort(p,0,4);

    }

    自然最主要的函数就是DifferentSort()函数了

    (1)变量j是从第几个开始处理,变量i控制的是处理区域的大小,i-j+1就是所需要处理的数字的个数,k就是将这i-j+1个数旋转的控制变量。j从第0个数开始处理,i从j开始慢慢变大到数组长度。

    (2)递归时先执行最后的那个,即j=3的情况,直接输出1234,然后考虑j=2的情况,输出1243,并将p还原为1234,然后考虑j=1的情况p变为1324,然后对此p执行DifferentSort(p,2,count)变为1342,然后先还原为1324再还原为1234;

    同理j=0的情况,i=1时,p变为2134,然后对2134执行DifferentSort(p,2,count)先变为2143...总之先执行最后的那个函数,并输出。。。这个还得慢慢体会

  • 相关阅读:
    中国移动神州行5元卡普遍缺货
    中国移动:抢占4G开展先机 上马手机付出
    广东可团购烧号CDMA版iPhone 4
    买了一款新手机!show 一下
    提供浙江大学信息与通信工程专业的考研资料
    实习实习!
    考研or保研?
    处理 NSOpertion 间依赖关系的一种方式
    2D & 3D Engine Resource
    在 iOS 应用中使用 Lua 作为模块粘合剂的方法
  • 原文地址:https://www.cnblogs.com/yunerlalala/p/5475455.html
Copyright © 2020-2023  润新知