我需要创建N个嵌套循环来打印长度为N的二进制序列的所有组合。我不知道该怎么做。
非常感谢任何帮助。感谢。
答案 0 :(得分:7)
使用递归。例如,在Java中
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
答案 1 :(得分:0)
这里有两个选项:
答案 2 :(得分:0)
您不需要任何嵌套循环。你需要一个递归函数来打印长度为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
答案 3 :(得分:0)
我认为我们不需要递归或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");
}