Функція для отримання можливих перестановок або комбінаторика для 1с-нега

Функція, що повертає масив всіх можливих перестановок довільного безлічі, що складаються з певної кількості елементів. З повтореннями елементів або без.

Знадобилося (не питайте навіщо) знайти і проаналізувати всі можливі комбінації елементів масиву довільної довжини. Завдання хрестоматійна. Так як число можливих елементів і довжина комбінації на етапі постановки завдання не визначені, напрошується рекурсивне рішення. І що ж я знаходжу по темі? Нічого для 1С, але безліч всяких різних реалізацій на сях, Дельфах і навіть VBA.

Що ж, думаю - треба перекладати. Переклав на 1С. Але потрібно було, щоб без повторень одного і того ж елемента результуючі комбінації були. Почав дописувати і правити. В результаті від початкового алгоритму не залишилося нічого, а сама реалізація стала коротше, ніж пропонувалася на С, та ще й з додатковою опцією без повторів елеметов в можливих комбінаціях.

Погорду собою хвилин 20 і вирішив поділитися з співтовариством. Може, кому-небудь стане в нагоді, і буде моєю карму зайвий лайк :)

За аргументів все, сподіваюся, зрозуміло з опису. За результатами: на виході отримуємо масив з фіксованих масивів. Фіксований масив - можлива комбінація, а кількість елементів результуючого масиву і є кількість знайдених (можливих) комбінацій. Кожен фіксований масив складається з ДлінаПерестановкі елементів масиву мЕлементов - то є якийсь набір елементів первісного безлічі значень. Або одна з можливих комбінацій.

Очевидна річ, але все таки попереджу. Якщо ДлінаПерестановкі в аргументах буде більше числа елементів в масиві мЕлементов, а умова унікальності при цьому буде Істина, в результаті Ви отримаєте чудовий, але порожній масив результатів. Чому? Та тому, що не можна зібрати з Х можливих елементів комбінацію довжиною в Y, не повторюючись, якщо X

P.S. Передбачаючи обурення широкої громадськості з приводу "нафіга нам чесним, розумним, скромним і звичайним 1С-негам це потрібно" згадав одну публікацію по темі, як допомогти бухгалтеру визначити, які ж з можливих чисел утворюють в сумі помилку. Ось Вам і готова сфера застосування функції. І при цьому використовується справжній, витриманий і марочний 1С, а не Java :)

Схожі статті