[Решено]Функция, которая выводит все возможные варианты комбинаций между элементами массива.

xopagpuk

Профан - программист.
И снова здравствуйте, уважаемые. Очередной вечер сломал мозги на следующей задаче: Требуется организовать функцию, которая выводила бы все возможные комбинации из элементов массива. Пример:
Массив:
1,2,3
Выводим:
1,2,3
1,3,2
2,3,1
2,1,3
3,1,2
3,2,1
Организовать нужно, чтобы не только с 3мя элементами мог работать, но и с 4мя и с 5ю.
Сколько я не подхожу к этой задаче - не получается понять принцип ее реализации. Конечно задача требует нахождение факториала и количества массива. Но как все это сделать воедино, я не догадался.

Предварительный код.
[spoiler ]
Код:
function mixOne ($array)
{
   
   
    for ($j = 0; $j < $f; $j++)
    {
        $n = count($array);//количество слов в массиве
        $f = 1;
        for ($i = 1; $i < $n; $i++)
        {
            $f = $f * $i;
        }
        //$f - факториал
        {
            echo implode(" ",$array)."<br>";
            $c=$array[$f];
            $array[$f]=$array[$n-1];
            $array[$n-1]=$c;
        }
    }
}
[/spoiler]

Как я понял алгоритм следующий:
1.Выводим изначальный массива.
2.Меняем последние два элемента
3.Вывод массива.
4.Ставим первый элемент на последнюю позицию.

Повторяем $n(количество элементов) раз.

Данный цикл подходит для 3 элементов, но не для 2х и для 4х.
Как его универсализировать, и главное - как написать это в коде?

ЗЫ: Премного благодарен за все ваши конструктивные ответы.
 

WMix

герр M:)ller
Партнер клуба
а ты попробуй из 10 цифр (от 0-9) написать все комбинации к примеру 3х-значного числа, и подумай
 

xopagpuk

Профан - программист.
а ты попробуй из 10 цифр (от 0-9) написать все комбинации к примеру 3х-значного числа, и подумай
Спасибо за ваш ответ. Я на текущий момент в "творческом ступоре". Я думал над 4х значной комбинацией. И, к моему сожалению, мне не пришло решение в голову.
 

xopagpuk

Профан - программист.
И спустя 5 часов все равно затык...Сколько форумов не излазил, сколько не гуглил - не смог понять принцип. Организация вложенных циклов - без проблем. Но пропадает универсальность. Для универсальности нужна рекурсия. Она то и позволит при любом количестве элементов массива выводить необходимый результат.
 

xopagpuk

Профан - программист.
В любом случае, мне удалось получить нужную функцию, так что опубликую результат.
Код:
function mix ($words) {
$result = [];
//количество элементов массива
$n = count($words);
//ищем факториал
$f = 1;
for ($i = 1; $i <= $n; $i++) $f = $f * $i;
for($i=0;$i < $f; $i++) {
$pos = $i % ($n-1);
if($pos == 0) $first = array_shift($words);
$result[$i] = [];
for($j = 0; $j < $n-1; $j++ ) {
if($j == $pos) $result[$i][]=$first;
$result[$i][] = $words[$j];
}
if($pos==($n-2)) {
$words[]=$first;
}
}
return ($result);
Функция, на момент публикации рабочая. Функция принимает на себя массив элементов, и возвращает массив со всеми возможными вариантами/комбинациями между элементами массива. Пользуйтесь на здоровье!
 

AnrDaemon

Продвинутый новичок
Потому что должно быть актуально для любого количество элементов массива. Либо я не совсем вас понял
Не поняли. :) И, да, рекурсия НЕ годится для "любого количества".
Рекурсия и итерация решают одну и ту же задачу, но разными методами.
Рекурсия бесконечно падает в саму себя, в пределе выпадая из стека на пол.
Итерация же обрабатывает тот же объём данных на одном уровне стека.
 
Последнее редактирование:
Сверху