c – 在故障时生成组合问题的非递归方法

我想要一种非递归方法来解决生成某些字符或数字组合的问题.

因此,给定数字n的子集k,生成所有可能的组合n!/ k!(n-k)!

给定前一个组合,递归方法将给出组合.

非递归方法将生成给定值的循环索引i的组合.

我用这段代码解决了这个问题:

测试n = 4和k = 3,它可以工作,但如果我将k改为数字> 3它不起作用.

是因为(n-k)!在n = 4且k = 3的情况下,如果k> 1,则k = 3. 3它将超过1?

谢谢.

int facto(int x);

int len,fact,rem=0,pos=0;
int str[7];
int avail[7];


   str[0] = 1;
   str[1] = 2;
   str[2] = 3;
   str[3] = 4;
   str[4] = 5;
   str[5] = 6; 
   str[6] = 7;




  int tot=facto(n) / facto(n-k) / facto(k);




for (int i=0;i<tot;i++)
{


       avail[0]=1;
       avail[1]=2;
       avail[2]=3;
       avail[3]=4;
       avail[4]=5; 
       avail[5]=6;
avail[6]=7;



    rem = facto(i+1)-1;
    cout<<rem+1<<". ";
    for(int j=len;j>0;j--)
    {
        int div = facto(j); 
        pos = rem / div; 
        rem = rem % div; 
        cout<<avail[pos]<<" "; 
        avail[pos]=avail[j];

    }
    cout<<endl;
}

int facto(int x)
{
    int fact=1;
    while(x>0) fact*=x--;
    return fact;
}

最佳答案 呃..为什么不用
std::next_permutation?它完全符合您的要求,并且不需要您编写(以及调试和维护)您自己的.

点赞