• 递归循环嵌套排列组合


    数组a中有n个字符元素,输出m(m<=n)个元素组成的所有组合。
    例如n=3,m=2,a[0]='a',a[1]='b',a[2]=1时,输出为ab a1 b1
    写程序输入n,m及a,输出所有组合

    /*
        Name: 
        Copyright: 
        Author: malic答案 http://www.malic.xyz/ans839/2010/
        Date: 02/12/18 10:44
        Description: 本题的程序代码是所有元素均不相同的组合情况。
        如果要求从N个数中选M个数输出组合,
        M与N均是已知,那么写M重循环进行遍历就可以。
        但现在循环重数M不能预先知道,这种循环就不能实现。
        这时可以使用用递归,
        每次递归调用进行一重循环,直到循环层数达到要求,
        再输出结果。
        这个程序可以调试。 
    */
    #include <stdio.h>
    #define MAXN 20
    int index[MAXN];
    char a[MAXN];
    
    void solve(int n,int m,int level)
    {
       int i;
       if(m==level){/*此时index数组已经构建完成*/
        for(i=0;i<m;i++) printf("%c ",a[index[i]]);
        printf("
    "); 
        }
       else{
        for(i=index[level-1]+1;i<n;i++){
        /*这里可以放心的使用i=index[level-1]+1;这一循环起点,因为在56出现过了时,
        再组合一次65绝对是重复了,所以index数组必然是一个首元素最小的数组,
        index[level]只可能比index[level-1]要大*/
           index[level]=i;
           solve(n,m,level+1);
        }
       }
    }
    
    int main()
    {
       int i,n,m;
        
       scanf("%d%d",&n,&m);
       scanf("%s",a);/*a是一个字符数组,也可以当成字符串处理*/
       for(i=0;i<n;i++){/*绝妙*/
        index[0]=i;
        solve(n,m,1);
       }
       return 0;
    }
  • 相关阅读:
    语法树,短语,直接短语,句柄
    理解文法和语法
    了解编译原理
    实习日记7.20
    实习日记7.19
    实习日记7.18
    实习日记7.15
    实习日记7.13-7.14
    实习日记7.12
    实习日记7.11
  • 原文地址:https://www.cnblogs.com/lingr7/p/10052726.html
Copyright © 2020-2023  润新知