Возможный способ сделать это рекурсивным алгоритмом? - PullRequest
0 голосов
/ 05 декабря 2011

Я пытаюсь, чтобы массив с n элементами переставлял примерно так:

permute(x,y,z)
permute(-x,y,z)
permute(x,-y,z)
permute(-x,-y,z)

Это похоже на увеличение в двоичном коде (если знаки - представляют 1с).Я пытаюсь сделать это в коде, и заметил это:

    list[1] = -list[1];
        perm(list, k, m);
        list[1] = -list[1];
        list[2] = -list[2];
        perm(list, k, m);
        list[1] = -list[1];
        perm(list, k, m);
        list[1] = -list[1];
        list[2] = -list[2];
        list[3] = -list[3];
        perm(list, k, m);
        list[1] = -list[1];
        perm(list, k, m);
        list[1] = -list[1];
        list[2] = -list[2];
        perm(list, k, m);
        list[1] = -list[1];
        perm(list, k, m);
        list[1] = -list[1];
        list[2] = -list[2];
        list[3] = -list[3];
        list[4] = -list[4];
        perm(list, k, m);

Я заметил, что некоторые разделы повторяются.Есть ли способ записать это в цикл?Спасибо.

1 Ответ

4 голосов
/ 05 декабря 2011

Возвращает k th перестановку по вашей схеме:

IEnumerable<int> Perm(IEnumerable<int> source, int k)
{
    return source.Select((x, i) => ((k >> i) & 1) == 1 ? -x : x);
}

Пример:

var data = new[] { 1, 2, 3, 4 };

for (int k = 0; k < (1 << data.Length); k++)
{
    Console.WriteLine(string.Join(", ", Perm(data, k)));
}

Выход:

1, 2, 3, 4
-1, 2, 3, 4
1, -2, 3, 4
-1, -2, 3, 4
1, 2, -3, 4
-1, 2, -3, 4
1, -2, -3, 4
-1, -2, -3, 4
1, 2, 3, -4
-1, 2, 3, -4
1, -2, 3, -4
-1, -2, 3, -4
1, 2, -3, -4
-1, 2, -3, -4
1, -2, -3, -4
-1, -2, -3, -4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...