我需要创建N个嵌套循环来打印长度为N的二进制序列的所有组合。我不确定如何做到这一点。
任何帮助将不胜感激。谢谢。
public class Foo {
public static void main(String[] args) {
new Foo().printCombo("", 5);
}
void printCombo(String soFar, int len) {
if (len == 1) {
System.out.println(soFar+"0");
System.out.println(soFar+"1");
}
else {
printCombo(soFar+"0", len-1);
printCombo(soFar+"1", len-1);
}
}
}
将会打印出以下内容: 00000 00001 00010 ... 11101 11110 11111
if (notFeasable(soFar)) return;
- user949300你有两个选择:
你不需要嵌套循环来实现这个。你只需要一个递归函数来打印长度为N的二进制值,再用一个for循环遍历所有数字[0 .. (2^N)-1]。
user949300的解决方案也很好,但可能在某些语言中无法正常工作。
这是我的解决方案,递归方法大约比迭代方法慢两倍:
#include <stdio.h>
#ifdef RECURSIVE
void print_bin(int num, int len)
{
if(len == 0)
{
printf("\n");
return;
}
print_bin(num >> 1, len -1);
putchar((num & 1) + '0');
}
#else
void print_bin(int num, int len)
{
char str[len+1];
int i;
str[len] = '\0';
for (i = 0; i < len; i++)
{
str[len-1-i] = !!(num & (1 << i)) + '0';
}
printf("%s\n", str);
}
#endif
int main()
{
int len = 24;
int i;
int end = 1 << len;
for (i = 0; i < end ; i++)
{
print_bin(i, len);
}
return 0;
}
我在 Mac 上尝试打印长度为 24 的所有二进制数字,结果终端程序挂了。但这可能是终端实现较差的缘故。 :-)
$ gcc -O3 binary.c ; time ./a.out > /dev/null ; gcc -O3 -DRECURSIVE binary.c ; time ./a.out > /dev/null
real 0m1.875s
user 0m1.859s
sys 0m0.008s
real 0m3.327s
user 0m3.310s
sys 0m0.010s
我认为我们不需要使用递归或n个嵌套的for循环来解决这个问题。使用位运算处理这个问题将会更容易。
以C++为例:
for(int i=0;i<(1<<n);i++)
{
for(int j=0;j<n;j++)
if(i&(1<<j))
printf("1");
else
printf("0");
printf("\n");
}