2010-08-09 3 views
1

Я хочу перечислить перестановки только с 0 и 1. Подобно бинарной, но допускающей переменную длину, не должен равняться 8 длинам. Например:C#: 0 & 1 Перестановления

0 
1 
00 
01 
10 
11 
000 
001 
010 
011 
100 
101 
110 
111 

Весь путь до тех пор, пока не будет выполнена длина X. Как это может быть сделано?

+0

взглянуть на http://www.codeproject.com/KB/recipes/Combinatorics.aspx – Hoque

ответ

4

Я бы сделал это как рекурсивный вызов, одну функцию для выполнения всей определенной длины, другую - для всех соответствующих длин. Следующее полное консольное приложение C# 2008 показывает, что я имею в виду:

using System; 

namespace ConsoleApplication1 { 
    class Program { 
     static void permuteN(string prefix, int len) { 
      if (len == 0) { 
       System.Console.WriteLine(prefix); 
       return; 
      } 
      permuteN(prefix + "0", len - 1); 
      permuteN(prefix + "1", len - 1); 
     } 

     static void permute(int len) { 
      for (int i = 1; i <= len; i++) 
       permuteN("", i); 
     } 

     static void Main(string[] args) { 
      permute(3); 
     } 
    } 
} 

Воспроизводит:

0 
1 
00 
01 
10 
11 
000 
001 
010 
011 
100 
101 
110 
111 

что то, что я думаю, что вы были после.

5

Вы также можете использовать:

using System; 

class Test 
{ 
    static void permute(int len) 
    { 
     for (int i=1; i<=len; i++) 
     { 
      for (int j=0; j<Math.Pow(2, i); j++) 
      { 
       Console.WriteLine (Convert.ToString(j, 2).PadLeft(i, '0')); 
      } 
     } 
    } 
} 

Который не предполагает рекурсию :)

+0

Ах, точно как я представлял себе в голове, но не передавал правильно. :) –

+0

Это потрясающе. Как в мире вы нашли решение, подобное этому? Я преклоняюсь перед вами, NullUserException! –