递归回溯可打印长度为N的二进制数的所有组合,而无需使用循环

时间:2018-07-17 04:53:46

标签: c++ algorithm recursion backtracking

需要使用递归和无循环功能来打印二进制数字的所有组合。

void printBinary(int n)
{
    if(n==1)
    {
        cout << "0" << endl;
        cout << "1" << endl;
    }
    else 
    {
        // How do I call?
    }

}

printBinary(3)的示例输出:

000
001
010
011
100
101
110
111

3 个答案:

答案 0 :(得分:3)

递归问题是您没有保存答案

这部分会给您带来困难:

if(n==1)
    {
         cout << "0" << endl;
         cout << "1" << endl;
    }

从那部分开始,我认为您想“在递归的每个状态下,打印对应的数字,然后在第n次递归后打印最后一个数字”

如果您认为“递归的每种状态,确定数字值然后将其传递到其他状态,然后在第n次递归后打印传递的值,则将更容易”

这就是我在C ++中实现它的方式:

void bin(int n, string answer){
    if(n==0){
        cout << answer << endl;
    }else{
        bin(n-1, answer+"0");
        bin(n-1, answer+"1");
    }
}

,当您将其命名为bin(3,"")时,它将为您提供:

000
001
010
011
100
101
110
111

答案 1 :(得分:1)

随着位数的增加,答案总数增加了2倍,因此您将不得不两次调用一个函数

vector <string> getall(string k,int req){
    if(k.length()==req) return {k};
    vector <string> C;
    vector <string> D;
    k.push_back('0');
    D = getall(k,req);
    if(D.size()>0) C.insert(C.end(),D.begin(),D.end());
    k.pop_back();
    k.push_back('1');
    D = getall(k,req);
    if(D.size()>0) C.insert(C.end(),D.begin(),D.end());
    k.pop_back();
    return C;
}

因此,只需使用一个空字符串调用此函数,并将req作为要打印的位数,它将以升序打印,因为我们首先选择0,否则如果我们先选择1降序,则将打印。

string k = "";
int req = 5;
vector <string> s = getall(k,req);

如果您只想打印而不是返回第一行,可以在那儿打印。

答案 2 :(得分:1)

这是c版本

void bin(int n, char *answer,int size){
if(n==0){
    printf("%s\n", answer);
}else{
    memcpy(&answer[size-n],"0",1);
    bin(n-1, answer,size);
    memcpy(&answer[size-n],"1",1);
    bin(n-1, answer,size);
}

}