@LuVairo

Как исправить рекурсивный алгоритм?

Пишу рекурсивный алгоритм, который заполняет лист всевозможными вариантами перестановок.
На выходе (при указанном наборе входных данных) получаю:
1 0
1 0
Но ожидается:
0 1
1 0
Помогите, пожалуйста, исправить сложившуюся ситуацию. Только начал изучать рекурсию и не могу сообразить, что тут не так.
namespace Permutations
{
    internal class Program
    {
        static void GetPermutations(int[] permutations, int position, List<int[]> result)
        {
            if (position == permutations.Length)
            {
                result.Add(permutations);
                return;
            } 

            for (var i = 0; i < permutations.Length; i++)
            {
                if (Array.IndexOf(permutations, i, 0, position) != -1) 
                    continue;

                permutations[position] = i;
                GetPermutations(permutations, position + 1, result);
            }
        }

        static void Main()
        {
            var list = new List<int[]>();

            GetPermutations(new int[2], 0, list);

            foreach (var i in list)
                Console.WriteLine(string.Join(" ", i));
        }
    }
}
  • Вопрос задан
  • 56 просмотров
Решения вопроса 1
@MrGreger
Массив - ссылочный тип
result.Add(permutations); - здесь ты добавляешь ссылку на этот массив, после чего снова работаешь с этим же массивом. В итоге оба элемента result являются ссылками на один и тот же массив, поэтому в консоль выводится несколько раз один и тот же вариант.

В result.Add тебе нужно передать отдельную копию массива, например так
result.Add(permutations.Clone() as int[]);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы