我正在寻找一个好的(易于实现,直观等)递归方法来生成长度为n
的所有二进制字符串,其中1 <= n <= 35
。
我很欣赏伪代码算法的想法(没有语言特定的技巧)。
LE:好的,我确实超出了上限。我的目的是避免使用从1
到1 << n
的计数器的二进制表示的解决方案。
答案 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
实施:
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);