Loading...
t_zhelev avatar t_zhelev 24 Точки

Изваждане на всички пермутации на число n

Здравейте,

В момента карам програминг бейсик, но след като реших всички задачи от домашните почнах да си ровя в нета и да си решавам някакви тъпи задачки. Опитвам се да направя програма която при въведено число да печата всички пермутации на елементите 1,2,3,...n. Абстрахирайте се от това че като въведа число по голямо от 10 алгоритъма ми ще печата до вдругиден и ако може ми кажете защо когато го извикам в главната програма не се предава правилно на масива. Като цяло това ми е първия досег с листове и рекурсия и доста се помъчих докато го докарам до работеща програма и съм сигурен че има много по оптимални начини това да се направи. Кода на задачата може да видите тук:

http://pastebin.com/w5yJi7Zy

Тагове:
0
Общи приказки 12/06/2016 06:51:53
PlamenMetodiev avatar PlamenMetodiev 14 Точки
Best Answer

Здравейте,
 

Ето това е стандартно решение на пармутации от 1 до n. Виж курса по Алгоритми от април 2016 години и една от първите лекции е за комбинаторика. Ползва се масив и рекурсия. Дъното е индекса на масива, за да спре, когато е по-голям от масива. Прави се размяна на самите числа, за да се образуват пермутациите, след което се извиква отново функцията с увеличен индекс. След като удари на дъно числата отново се разменят. С дебъгване ще го разбереш по-добре.

Кода не е много дълъг и затова го пращам в коментара.
 

private static int countOfPermutations = 0;

        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());
            int[] array = Enumerable.Range(1, n).ToArray();
            GenPermutations(array);
            Console.WriteLine();
        }

        static void GenPermutations(int[] array, int index = 0)
        {
            if (index >= array.Length - 1)
            {
                Console.WriteLine("{0}", string.Join(", ", array));
                countOfPermutations++;
            } else
            {
                for (int i = index; i < array.Length; i++)
                {
                    Swap(ref array[index], ref array[i]);
                    GenPermutations(array, index + 1);
                    Swap(ref array[i], ref array[index]);
                } 
            }
        }

        static void Swap(ref int i, ref int j)
        {
            if (i == j)
            {
                return;
            }

            i ^= j;
            j ^= i;
            i ^= j;
        }

0
t_zhelev avatar t_zhelev 24 Точки

Благодара, ще разгледам после как работи това. Все пак ако някой може да погледне и моя код и сподели insight защо когато печата в тялото на функцията всичко е ток и жица, но като го предам на променлива в програмата и се предава.

0
t_zhelev avatar t_zhelev 24 Точки

След като разгледах кода ти успях да си оправя и моето да работи.

Edited (за който му е интересно):

http://pastebin.com/sjj2sNvi

Утре като имам повече време, ще разгледам малко в дълбочина и твоя код и ще реша кой ще ми върши повече работа в моя случай :)

0
13/06/2016 10:29:11
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.