Прежде всего: пахнет рекурсия конечно!
Поскольку вы также хотели знать этот принцип, я сделал все возможное, чтобы объяснить его на человеческом языке. Я думаю, что рекурсия в большинстве случаев очень проста. Вы должны понять только два шага:
- Первый шаг
- Все остальные шаги (все с той же логикой)
На человеческом языке :
Короче говоря:
1. Перестановка 1 элемента - это один элемент.
2. Перестановка набора элементов представляет собой список каждого из элементов, соединенных с каждой перестановкой других элементов.
* +1019 *
Пример: * ** +1023 тысяча двадцать-два *
Если в наборе только один элемент ->
верни его.
Пермь (а) -> а
Если в наборе есть два символа: для
каждый элемент в нем: вернуть
элемент, с перестановкой
Остальные элементы добавлены, вот так:
Пермь (ab) ->
a + perm (b) -> ab
b + perm (a) -> ba
Далее: для каждого символа в наборе: вернуть символ, объединенный с разрешением> остальной части набора
Пермь (abc) ->
a + perm (bc) -> abc , acb
b + perm (ac) -> bac , bca
c + perm (ab) -> cab , cba
Пермь (abc ... z) ->
a + perm (...), b + perm (....)
....
Я нашел псевдокод на http://www.programmersheaven.com/mb/Algorithms/369713/369713/permutation-algorithm-help/:
makePermutations(permutation) {
if (length permutation < required length) {
for (i = min digit to max digit) {
if (i not in permutation) {
makePermutations(permutation+i)
}
}
}
else {
add permutation to list
}
}
C #
ОК, и что-то более сложное (и так как он помечен c #), от http://radio.weblogs.com/0111551/stories/2002/10/14/permutations.html:
Довольно длинный, но я все равно решил его скопировать, поэтому пост не зависит от оригинала.
Функция принимает строку символов и записывает каждую возможную перестановку этой точной строки, поэтому, например, если было указано «ABC», должно появиться:
ABC, ACB, BAC, BCA, CAB, CBA.
Код:
class Program
{
private static void Swap(ref char a, ref char b)
{
if (a == b) return;
a ^= b;
b ^= a;
a ^= b;
}
public static void GetPer(char[] list)
{
int x = list.Length - 1;
GetPer(list, 0, x);
}
private static void GetPer(char[] list, int k, int m)
{
if (k == m)
{
Console.Write(list);
}
else
for (int i = k; i <= m; i++)
{
Swap(ref list[k], ref list[i]);
GetPer(list, k + 1, m);
Swap(ref list[k], ref list[i]);
}
}
static void Main()
{
string str = "sagiv";
char[] arr = str.ToCharArray();
GetPer(arr);
}
}