c ++中的递归(生成二进制代码)

时间:2013-09-20 14:33:17

标签: c++ recursion

我正在尝试编写一个程序,在给定输入编号(位数)的情况下生成所有二进制代码。例如,如果用户输入3,则应生成以下所有数字:

000
001
010
011
100
101
110
111

该函数被称为generateBinaryCode(),它必须是递归的(这是问题的挑战)。

以下是我的尝试,但不起作用。有人可以给我一些见解吗?

提前致谢。

#include <iostream>
#include <string>
#include <vector>

using namespace std;
vector<string> generateBinaryCode(int nBits);

int main()
{
    int input;

    while (true)
    {
        cout << "Enter an integer (any negative numbers are sentinel): ";
        cin >> input;
        if (input < 0) break;

        for (unsigned i = 0; i < generateBinaryCode(input).size(); i++)
            cout << generateBinaryCode(input).at(i) << endl;
    }

    return 0;
}

vector<string> generateBinaryCode(int nBits)
{
    vector<string> result;
    int size = result.size();
    std::vector<string>::iterator it;

    if (nBits == 1) {

        result.push_back("0");
        result.push_back("1");

    } else {
        result = generateBinaryCode(nBits - 1);

        for (unsigned int i = 0; i < result.size(); i++)
        {
            result.push_back("0" + result.at(i));
            result.at(i) = "1" + result.at(i);
        }

    }

    return result;
}

5 个答案:

答案 0 :(得分:1)

主要缺陷在以下循环中:

    for (unsigned int i = 0; i < result.size(); i++)
    {
        result.push_back("0" + result.at(i));
        result.at(i) = "1" + result.at(i);
    }

简而言之,您不希望在迭代它时向result添加元素。你现在拥有的是一个无限循环(最终会耗尽内存)。

此外,您不希望在主循环的每次迭代中调用generateBinaryCode()。调用一次并将结果存储在变量中。

最后(也是最不重要的),在提示符处输入0将导致无限递归。

答案 1 :(得分:1)

您的代码非常接近正确,但自我修改result将会出现问题。插入到向量中会做很多事情,其中​​包括使序列上当前打开的迭代器无效。但它也会改变size()的结果(出于显而易见的原因,我希望)。

最简单的答案是使用子列表向量,然后枚举 ,将所有条目追加到'0'和'1',并将这些结果插入到返回向量中。下面是一个例子:

std::vector<std::string> getBitStrings(unsigned int n)
{
    std::vector<std::string> result;

    if (n <= 1)
    {
        result.push_back("0");
        result.push_back("1");
    }
    else
    {   // recurse, then add extra bit chars
        std::vector<std::string> sub = getBitStrings(n-1);
        for (std::vector<std::string>::const_iterator it = sub.cbegin();
             it != sub.cend(); ++it)
        {
            result.push_back(*it+'0');
            result.push_back(*it+'1');
        }
    }
    return result;
}

这与您的实现有所不同,因为它期望位数在1和n之间。使用n=5运行,生成以下内容:

int main()
{
    std::vector<std::string> bs = getBitStrings(5);
    std::copy(bs.begin(), bs.end(), 
         std::ostream_iterator<std::string>(std::cout, "\n"));
    return 0;
}

<强>输出

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

说实话,有很多方法可以做到,这只是一个。我故意在原始实现之后对其进行建模,以限制算法更改。我希望它能帮助您理解问题并解决问题。

答案 2 :(得分:0)

你想在这一行做什么

result.push_back("0" + result.at(i));

基本上是this,这可能是狡猾的,也是问题的原因。

答案 3 :(得分:0)

简单明了的解决方案

void printBin(std::string prefix, int n)
{
    if(prefix.size() == n)
    {

        std::cout <<prefix <<std::endl;
        return;
    }

    printBin(prefix + '0', n);
    printBin(prefix + '1', n);

    return;

}

int main()
{
    int n;
    std::cin >> n;
    printBin("", n);
    return 0;
 }

答案 4 :(得分:-1)

这是一个简单的问题:
(用C语言编写,而不是C ++,但大纲应该相同)

void generateBinaryCode(char* txt, int i, int len)
{
    if (len != 0)
    {   txt[i] = '0';
        makeBinary(txt, i+1, len-1);

        txt[i] = '1';
        makeBinary(txt, i+1, len-1);
    } else
    {
        puts(txt);
    }
}


int main()
{
    char str[4] = {0};

    generateBinaryCode(str, 0, sizeof(str)-1);

    getchar();
    return 0;
}