递归生成长度为n的所有二进制字符串的最佳方法是什么?

时间:2013-02-14 14:03:52

标签: algorithm recursion language-agnostic binary

我正在寻找一个好的(易于实现,直观等)递归方法来生成长度为n的所有二进制字符串,其中1 <= n <= 35

我很欣赏伪代码算法的想法(没有语言特定的技巧)。

LE:好的,我确实超出了上限。我的目的是避免使用从11 << n的计数器的二进制表示的解决方案。

4 个答案:

答案 0 :(得分:7)

这是C ++中递归的一个例子。

vector<string> answer;

void getStrings( string s, int digitsLeft )
{
   if( digitsLeft == 0 ) // the length of string is n
      answer.push_back( s );
   else
   {
      getStrings( s + "0", digitsLeft - 1 );
      getStrings( s + "1", digitsLeft - 1 );
   }
}

getStrings( "", n ); // initial call

答案 1 :(得分:1)

根据Divide et Impera范例,生成长度为n的所有二进制字符串的问题可以分为两个子问题:打印长度为n-1的所有二进制字符串的问题先于0和打印所有二进制字符串的问题长度为n-1的二进制字符串前面加1.因此下面的伪代码解决了这个问题:

generateBinary(length, string)

if(length > 0)
    generateBinary(length-1, string + "0")
    generateBinary(length-1, string + "1")
else
    print(string)

答案 2 :(得分:0)

{{1}}

答案 3 :(得分:0)

您可以使用Backtracking算法解决问题。

这种算法的

伪代码是:

fun(input, n) 
    if( base_case(input, n) ) 
        //print result
    else
        //choose from pool of choices
        //explorer the rest of choices from what's left
        //unchoose

实施:

  • 基本情况:我们希望在结果字符串的大小等于 n
  • 时打印结果字符串
  • 递归案例:
    • 我们的选择池由 0 1
    • 组成
    • 在这种情况下选择意味着取0或1,并将其添加到输入作为最后一个字符
    • 通过递归进行探索,我们在选择步骤中传递新的 input 值,直到达到基本情况为止
    • 在这种情况下取​​消选择意味着删除最后一个字符

function binary(n) {
  binaryHelper('', n);
}

function binaryHelper(str, n) {
  if (str.length === n) {
    //base case
    console.log(str); //print string
  } else {
    for (let bit = 0; bit < 2; bit++) {
      str = str + bit; // choose
      binaryHelper(str, n); // explore
      str = str.slice(0, -1); // un-choose
    }
  }
}

console.log('Size 2 binary strings:');
binary(2);
console.log('Size 3 binary strings:');
binary(3);

您可以像这样重新编写上面的代码,在该代码中,您可以通过从一个循环迭代到另一个循环的无状态转换来选择和取消选择。但是,这不太直观。

function binary(n) {
  binaryHelper('', n);
}

function binaryHelper(str, n) {
  if(str.length === n) {
    console.log(str);
  } else {
    for(let bit = 0; bit < 2; bit++) {
      binaryHelper(str+bit, n);
    }
  }
}

console.log('Size 2 binary strings:');
binary(2);
console.log('Size 3 binary strings:');
binary(3);