Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: Комбинации и перестановки

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

kosola



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Предположим есть элементы s1 s2 s3 s4 s5...  
Необходимо получить массив всех возможных уникальных перестановок. Второй день ломаю голову, знаю что нужна рекурсия, но ничего путного написать не могу. Нашел в сети вариант на паскале переписал его на php, но либо я ошибся, либо алгоритм не верный, так как он некоторые перестановки пишет по 2 раза.

Код:
 
function Change(&$a,&$b)
{
    $c = $a;
    $a = $b;
    $b = $c;
}
function replaceElement($string, $num)
{
    if ($num == count($string)-1)
    {
        for ($i = 0 ; $i < count($string); $i++)
            print($string[$i].' ');
        print("\r\n");
    }
    else
        for ($i = 0 ; $i < count($string)-1; $i++)
        {
            Change($string[$num+1], $string[$i]);
            replaceElement($string, $num+1);
            Change($string[$num+1], $string[$i]);
        }
}
 

 
Добавлено:
Думаю этот алгоритм такой же "полезный" как все остальные написанные мною ранее по данному вопросу, так как с 3мя значениями он не отображает всех вариантов...
 
P.S.: количество перестановок должно быть N! (факториал), где N - количество элементов.

Всего записей: 134 | Зарегистр. 12-11-2007 | Отправлено: 10:40 07-05-2010
Jokerjar79



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Код:
  function BackTrace(&$srcarr, $cnt = 0, $arr = array(), $mask = array())
  {
    if (count($srcarr) == $cnt) { echo implode(', ', $arr) . '<br />'; return; }
    for ($i = 0; $i < count($srcarr); $i++)
      if (!$mask[$i]) { $mask[$i] = true; $arr[$cnt] = $srcarr[$i]; BackTrace($srcarr, $cnt + 1, $arr, $mask); $mask[$i] = false; }
  }
 
  $srcarr = array('ru', 'en', 'ua');
  BackTrace($srcarr);

Всего записей: 710 | Зарегистр. 08-09-2007 | Отправлено: 11:29 07-05-2010
kosola



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Огромное спасибо... до сих пор впечатлен простотой решения вопроса.

Всего записей: 134 | Зарегистр. 12-11-2007 | Отправлено: 11:41 07-05-2010
KlimKlim



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Прикольно написал почти как на лиспе

Всего записей: 383 | Зарегистр. 23-03-2006 | Отправлено: 21:24 07-05-2010
rekrow

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Уважаемые программисты, подскажите пожалуйста,как изменить данный код, чтобы:
1) Вставить необходимую длину комбинации(как переменная)
2) Генерировать комбинации только вида,к примеру: 0001122334,010123234,400123032,т.е. одна цифра должна повторяться только 3 раза,вторая,третья и четвертая цифры только по 2 раза,а остальные цифры только по одному разу.
 
За помощь готов отблагодарить.
 
Спасибо большое!

Всего записей: 1 | Зарегистр. 15-06-2011 | Отправлено: 14:33 15-06-2011
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » PHP: Комбинации и перестановки


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

LiteCoin: LgY72v35StJhV2xbt8CpxbQ9gFY6jwZ67r

Рейтинг.ru