Перестановки - все возможные наборы чисел - PullRequest
33 голосов
/ 01 апреля 2011

У меня есть числа от 0 до 8. Я хотел бы, чтобы в результате все возможные наборы этих чисел, каждый набор должен использовать все числа, каждое число может встречаться только один раз в наборе.хотелось бы увидеть решение, сделанное в PHP, которое может распечатать результат.Или, по крайней мере, мне хотелось бы немного освежить теорию комбинаторики, как я ее давно забыл.Какова формула для расчета количества перестановок?

Примеры наборов:

  • 0-1-2-3-4-5-6-7-8
  • 0-1-2-3-4-5-6-8-7
  • 0-1-2-3-4-5-8-6-7
  • 0-1-2-3-4-8-5-6-7
  • 0-1-2-3-8-4-5-6-7
  • 0-1-2-8-3-4-5-6-7
  • и так далее ...

Ответы [ 12 ]

1 голос
/ 01 апреля 2011

Вы в основном говорите о перестановках, где n и k равны 9, поэтому у вас будет 9! разных перестановок;смотри это: http://en.wikipedia.org/wiki/Permutation.

0 голосов
/ 04 марта 2019
//function call
print_r(combinations([1,2,3,4,5,6,7,8,9,10,11,12,13]));
/**
 * @param $mainArray
 * @param int $size - optional
 * @param array $combinations - optional
 * @return mixed
 */
function combinations($mainArray, $size = 3, $combinations = [])
{
    if (empty($combinations)) {
        $combinations = $mainArray;
    }
    if ($size == 1) {
        return str_replace('-','',$combinations);;
    }
    $newCombination = array();
    foreach ($mainArray as $key => $val){
        foreach ($combinations as $char) {
            if(in_array($val, explode('-', $char))){
                continue;
            }
            $newCombination[] = $val . '-' . $char;
        }
    }
    return combinations($mainArray, $size - 1, $newCombination);
}

// ========================= Следующее решение ================== ================

<code>function sampling($chars, $size, $combinations = array()) {
    # if it's the first iteration, the first set 
    # of combinations is the same as the set of characters
    if (empty($combinations)) {
        $combinations = $chars;
    }
    # we're done if we're at size 1
    if ($size == 1) {
        return $combinations;
    }
    # initialise array to put new values in
    $new_combinations = array();
    # loop through existing combinations and character set to create strings
    foreach ($combinations as $combination) {
        foreach ($chars as $char) {
            $new_combinations[] = $combination .'-'. $char ; 

        }
    }
    # call same function again for the next iteration
    return $this->sampling($chars, $size - 1, $new_combinations);
}
function array_has_dupes($array) {
   return count($array) !== count(array_unique($array));
}   
function total() {
    // Generate ticket price
    $arrfinal = array();
    // combinations
    $chars = array(1,2,3,4,5,6,7,8,9,10,11,12,13); // for 10 digits
    $combinations = $this->sampling($chars, 3);
    //print_r($combinations); //exit;

    foreach($combinations as $key => $val)
    {
        $arr = explode('-', $val);//str_split($val);
        if(!$this->array_has_dupes($arr)){
            $arrfinal[] = str_replace('-', '', $val);
        }
    }
  echo '<pre>'; print_r($arrfinal); echo '
'; }
...