N个嵌套for循环

时间:2011-11-14 18:38:24

标签: algorithm for-loop

我需要创建N个嵌套循环来打印长度为N的二进制序列的所有组合。我不知道该怎么做。

非常感谢任何帮助。感谢。

4 个答案:

答案 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)

这里有两个选项:

  1. 改为使用回溯。
  2. 编写一个程序,生成带有N个循环的动态程序,然后执行它。

答案 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");
}