Факториал? из m по n

  • Автор темы Жека К
  • Дата начала

Жека К

Guest
Факториал? из m по n

Доброго времени суток.
Не поможите рещить вот такую проблему.
Имеется массив,например:
a = array("1","2","3","4" и т.д);

Необходимо сосчитать результат выполнения его по факториалу,
то есть количество уникальных вхождений скажем по 2 значения в данный массив.
Разбиваем вручную, получается: 12,13,14,23,24,34, всего 6 штук.
А как его разбить при помощи PHP?, ведь возможно будет необходимо узнать количество
уникальных вхождений из 20 по 5, причем мне известно, что таких вхождений будет 15504,
Пробовал через цикл, array_slice и т.д. никак не получается.
Но какой код необходимо сделать ни как не доходит,
чтобы ЭТИ САМИ вхождения вырисовывалиь на экране (автоматом).
С уважением, Евгений
 

SiMM

Новичок
Математику в школе учил? А теорию вероятностей? Твой вопрос не имеет никакого отношения к PHP.
PS: и вообще, тут не принято верить на слово - никак не получается - это то же самое, что ничего не делал, сделайте за меня.
 

Sergio

Новичок
Если необходимо только количество разбиений, то С(n,k) = n!/(k!*(n-k)!). Как я понял, тебе нужно еще и вывести все полученные подмножества?
 

Жека К

Guest
Вообще-то математику изучал.
Получается количество вхождений по факториалу:
Формула:
Из какого количества чисел(m)/(Количество вхождений(n) * разность между m и n
Количество вхождений по этой формуле нахожу, НО если предположим данные будут, скажем,
1.2 2.3, 3.3 4.3 и т.д., то ЭТА формула не действует!
Евгений

-~{}~ 05.11.05 01:24:

SERGIO.
Вот в этом вся и проблема, ноеобходимо вывести подмножество, а здесь тупик!
 

Demiurg

Guest
Жека К
тебе нужно количество перестановок ? или сами перестановки ?
 

rotoZOOM

ACM maniac
Жека К один из способов (самый простой) - это делать рекурсией, на каждом шаге ты выбираешь один из элементов массива для конечной строки. Заведя счетчик, ты еще сможешь все это дело посчитать.
А избавиться от повторяющихся значений можно путем сортировки первоначального массива, а потом на каждом шаге выбирать только разные элементы.
 

SiMM

Новичок
> НО если предположим данные будут, скажем, 1.2 2.3, 3.3 4.3
Как ты себе представляешь 1.2 числа с 2.3 вхождениями?
 

Жека К

Guest
Demiurg
Мне необходимо вывести именно все те вхождения, которые должны быть, необходимо
вывести сами перестановки.

/-----------
itprog
Хочу сделать, чтобы пользователи на сайте вбивали значения, коэффициенты, а затем происходил
их рассчет.
Такой принцип используется по ставке типа 'Система' в букмекерских конторах.
См.
Рассмотрим пример на основе предыдущих событий:
Италия-Эквадор: поб.1 (1.4)
Польша-Корея: поб.2 (коэф. 3.0)
Германия-Ирландия: ничья (коэф. 3.1)
Поставим на размерность 2 из 3-х - 100 y.e.
Для вас это должно значить, что два из указанных
события обязательно сбудутся. Причем, чем на большую р
азмерность ставите, тем соответственно и выше будет итоговый коэффициент.

Итак, сам процесс расчета:
Получаем полный набор экспрессов (входит по 2 команды),
перемножаем коэффициенты в каждой из пар экспресса

Италия-Эквадор: поб.1 (1.4)
Польша-Корея: поб.2 (коэф. 3.0)
Коэффициент: 4.2

Италия-Эквадор: поб.1 (1.4)
Германия-Ирландия: ничья (коэф. 3.1)
Коэффициент: 4.34


Польша-Корея: поб.2 (коэф. 3.0)
Германия-Ирландия: ничья (коэф. 3.1)
Коэффициент: 9.3

Поставленные 100y.e. разбиваются на каждый из экспрессов поровну,
т.е. примерно по 33.3y.e. Как видим, в нашем случае все три экспресса сыграли,
находим наш выигрыш: 33.3y.e.х4.2(коэф.) + 33.3y.e.х4.34(коэф.) + 33.3y.e.х 9.3(коэф.)
= 594.072y.e. - 100y.e. (поставленные)=494.072y.e. (чистый выигрыш).
/ Вот такой принцип рассчета системы!

/----------------
SiMM
Вот такие вхождения можно определить, но через SWITCH, опять же код наверно получится
>15000 строк, и то, если максимум сделаем чтобы можно было вбивать ТОЛЬКО до 20 по 19.
/----
Евгений
 

SiMM

Новичок
> код наверно получится 15000 строк
Какие 15 тыс. строк? О чём ты?
PHP:
function rec($n,$data,$i=0){
  static $current;
  if (!$i) $current = array();
  for ($n--;$i<count($data);$i++){
    $current[$n] = $data[$i];
    if ($n) rec($n,$data,$i+1);
    else echo join(',',$current)."<br>\n";
  }
}
rec(2,range(1,4));
Свободен.
 

Жека К

Guest
Я про код имел ввиду, если ручками прописывать возможные
варианты исходов, и по ним как раз гнать

-~{}~ 05.11.05 19:08:

ОК <b>SiMM</b>
Конечно, полезный твой представленный код, но опять же мне
необходимо не заполнить массив, данные массива у меня будут из базы,а именно сосчитать
все вхождения по имеющимся данным.
Все-таки воспользуюсь дедовским приемом и сам разобью все возможные варианты перебора,
а затем из скольки и по сколько их буду гнать по коду, код достаточно большой, но
будет работать 100%, по крайней мере до из 10 по 5 вполне реально прогнать.
Евгений
 
Сверху