C:使用递归的0和1组合

C:使用递归的0和1组合,c,recursion,combinations,truthtable,C,Recursion,Combinations,Truthtable,我想根据变量数,使用c递归地列出o&1的组合 我想要的输出是 000 001 010 011 100 101 110 111 我尝试了很多算法,最后一个是: void permute(unsigned number) { if(number == 0) { printf("\n"); return; } permute(number - 1); printf("0"); permute(number -

我想根据变量数,使用c递归地列出o&1的组合

我想要的输出是

000
001
010
011
100
101
110
111
我尝试了很多算法,最后一个是:

void permute(unsigned number)    {

    if(number == 0) {
        printf("\n");
        return;
    }

    permute(number - 1);
        printf("0");
    permute(number - 1);
        printf("1");


}   //permute ends here


void permuteN(unsigned number) {

    unsigned i;

    for(i = 0; i < number + 1; i++){
        permute(i);
    }
}   //permuteN ends here
我想它给了我答案,但没有排序,因为我不知道放在哪里\n


需要你的帮助

如果你真的只是在寻找1和0的组合,我建议你把数字数一数,然后以二进制形式列出

以二进制数字0…7为单位,仅取最后3位,最终得到指定的相同集合:

000
001
...
...
111
对于n位组合,需要执行0..2^n-1

基于off,针对3位的一种特定情况 归功于@ChrisLutz和@dirkgently


如果你真的只是在寻找1和0的组合,我建议你把数字数一数,然后以二进制形式列出它们

以二进制数字0…7为单位,仅取最后3位,最终得到指定的相同集合:

000
001
...
...
111
对于n位组合,需要执行0..2^n-1

基于off,针对3位的一种特定情况 归功于@ChrisLutz和@dirkgently


你实际上所做的就是把一个数字转换成二进制。。。。一个简单的循环可以做到这一点,除了printf之外,没有任何库调用

编辑,因为您似乎想要递归。您需要有某种方法来指定需要多少位。您需要将其传递到递归例程中:

#include <stdio.h>

void permute(unsigned number, unsigned bits)
{
    if( bits == 0 ) return;
    permute(number / 2, bits-1);
    printf( "%d", number % 2 );
}   //permute ends here


void permuteN(unsigned number, unsigned bits ) {

    unsigned i;

    for(i = 0; i < number + 1; i++){
        permute(i, bits);
        printf("\n");
    }
}   //permuteN ends here

int main(void)
{
    permuteN(7, 3);
    return 0;   
}

要按所需顺序获得输出,您无法知道何时写入换行符。因此,在本例中,您需要在之后编写它。

您实际要做的就是将一个数字转换为二进制。。。。一个简单的循环可以做到这一点,除了printf之外,没有任何库调用

编辑,因为您似乎想要递归。您需要有某种方法来指定需要多少位。您需要将其传递到递归例程中:

#include <stdio.h>

void permute(unsigned number, unsigned bits)
{
    if( bits == 0 ) return;
    permute(number / 2, bits-1);
    printf( "%d", number % 2 );
}   //permute ends here


void permuteN(unsigned number, unsigned bits ) {

    unsigned i;

    for(i = 0; i < number + 1; i++){
        permute(i, bits);
        printf("\n");
    }
}   //permuteN ends here

int main(void)
{
    permuteN(7, 3);
    return 0;   
}

要按所需顺序获得输出,您无法知道何时写入换行符。所以在这种情况下,你可以在事后再写。

@paddy有一个很好的答案;你对我的评论的回复只是增加了一点我的强项,这对游戏来说有点晚了。这依赖于pow和log10的打印细节,尽管如此;如果使用gcc与-lm编译:

这可能有点让人困惑,但我猜你明白了

gcc-Wall-Wextra-pedantic-o combo.c-lm

或清洁输出:

您可能需要添加以下内容:

if (base > 10)
    printf("%x", number % base);
else
    printf("%d", number % base);
在prnt_组合中。通过这种方式,您可以在2 16之前获得:

    0 : 00
    1 : 01
    2 : 02
    3 : 03
    4 : 04
  ...
  250 : fa
  251 : fb
  252 : fc
  253 : fd
  254 : fe
  255 : ff

@帕迪的回答很好;你对我的评论的回复只是增加了一点我的强项,这对游戏来说有点晚了。这依赖于pow和log10的打印细节,尽管如此;如果使用gcc与-lm编译:

这可能有点让人困惑,但我猜你明白了

gcc-Wall-Wextra-pedantic-o combo.c-lm

或清洁输出:

您可能需要添加以下内容:

if (base > 10)
    printf("%x", number % base);
else
    printf("%d", number % base);
在prnt_组合中。通过这种方式,您可以在2 16之前获得:

    0 : 00
    1 : 01
    2 : 02
    3 : 03
    4 : 04
  ...
  250 : fa
  251 : fb
  252 : fc
  253 : fd
  254 : fe
  255 : ff

这些不是排列,这些是组合。@MatteoItalia不,根据维基百科和我的记忆,当顺序不重要时,你需要组合。在这种情况下,很明显顺序很重要001不同于010或100事实上这是三元笛卡尔积:@madth3置换是在集合中重新排序值的地方。组合是指在集合中取任意值。如果排列001,唯一的选项是001、010和100。@我没有说这些是排列,我只是指出它们也不是组合:。在一些圈子里,我看到这些被称为重复排列,但那是另一回事。这些不是排列,这些是组合。@MatteoItalia不,根据维基百科和我的记忆,当顺序不重要时,你需要组合。在这种情况下,很明显顺序很重要001不同于010或100事实上这是三元笛卡尔积:@madth3置换是在集合中重新排序值的地方。组合是指在集合中取任意值。如果排列001,唯一的选项是001、010和100。@我没有说这些是排列,我只是指出它们也不是组合:。在一些圈子里,我看到这些被称为重复排列,但那是另一个故事。我知道这个想法,但不是我想知道这个想法,而是我想你给我另一个好主意,而不是你给我另一个好主意
if (base > 10)
    printf("%x", number % base);
else
    printf("%d", number % base);
    0 : 00
    1 : 01
    2 : 02
    3 : 03
    4 : 04
  ...
  250 : fa
  251 : fb
  252 : fc
  253 : fd
  254 : fe
  255 : ff