N вложенных циклов - PullRequest
       2

N вложенных циклов

4 голосов
/ 14 ноября 2011

Мне нужно создать N вложенных циклов для печати всех комбинаций двоичной последовательности длины N. Я не уверен, как это сделать.

Любая помощь будет принята с благодарностьюСпасибо.

Ответы [ 4 ]

7 голосов
/ 14 ноября 2011

Используйте рекурсию.например, в 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

0 голосов
/ 15 ноября 2011

Я не думаю, что нам нужна рекурсия или вложенные циклы 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");
}
0 голосов
/ 14 ноября 2011

Для этого вам не нужны вложенные циклы. Вам нужна одна рекурсивная функция для вывода двоичного значения длины 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
0 голосов
/ 14 ноября 2011

У вас есть два варианта:

  1. Вместо этого используйте возврат.
  2. Напишите программу, которая генерирует динамическую программу с N циклами и затем выполняет ее.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...