Php 得到给定Y个数的X个数的每个组合?

Php 得到给定Y个数的X个数的每个组合?,php,arrays,math,logic,mathematical-expressions,Php,Arrays,Math,Logic,Mathematical Expressions,我遇到了一道数学题,因为我无法编写逻辑程序 让我用一个例子来解释: 假设我有4个洞和3个弹珠,这些洞是有序的,我的弹珠是A,B和C,也是有序的 我需要得到每个可能的有序组合: ABC4 AB3C A2BC 1ABC 这很简单,但是如果孔的数量发生变化怎么办?假设现在我有5个洞 ABC45 AB3C5 A2BC5 1ABC5 AB34C A2B4C 1AB4C A23BC 1A3BC 12ABC 现在让我们假设我们有5个洞和4个弹珠 ABCD5 ABC4D AB3CD A2BCD 1ABCD

我遇到了一道数学题,因为我无法编写逻辑程序

让我用一个例子来解释:

假设我有4个洞和3个弹珠,这些洞是有序的,我的弹珠是A,B和C,也是有序的

我需要得到每个可能的有序组合:

ABC4
AB3C
A2BC
1ABC
这很简单,但是如果孔的数量发生变化怎么办?假设现在我有5个洞

ABC45
AB3C5
A2BC5
1ABC5
AB34C
A2B4C
1AB4C
A23BC
1A3BC
12ABC
现在让我们假设我们有5个洞和4个弹珠

ABCD5
ABC4D
AB3CD
A2BCD
1ABCD
这可以是任意数量的洞和任意数量的大理石

组合的数量如下所示:

$combinations = factorial($number_of_holes)/(factorial($number_of_marbles)*factorial($number_of_holes-$number_of_marbles)))
(这里是阶乘函数,以备需要)

三套

[[1,2,3],[1,2,4],[1,3,4],[2,3,4]]
我需要的是这样做的逻辑,我正试图用PHP来做,但我就是不知道怎么做

函数将接收数组和集合大小,并返回集合数组:

function getCombinations($array,$setize){
    //magic code which I can't figure out
    return array(sets);
}
我希望这是足够清楚的,有人可以帮助我,我已经被困了好几天,但它似乎只是太多,我自己来处理

这篇文章,是针对所有可能的组合,重复元素和顺序并不重要,这是一个很好的线索,我读过,但它并不能解决我的问题,它非常不同。我需要它们,但不重复元素,并按说明进行排序


假设我的数组中已经有一组[3,4],我不想将[4,3]作为另一组。

这里有一个PHP递归解决方案:

function getCombinations($array, $setsize){  
    if($setsize == 0)
        return [[]];

    // generate combinations including the first element by generating combinations for 
    // the remainder of the array with one less element and prepending the first element:
    $sets = getCombinations(array_slice($array, 1), $setsize - 1);
    foreach ($sets as &$combo) {
        array_unshift($combo, $array[0]);
    }

    // generate combinations not including the first element and add them to the list:
    if(count($array) > $setsize)
        $sets = array_merge($sets, getCombinations(array_slice($array, 1), $setsize));

    return $sets;
}

// test:
print_r(getCombinations([1, 2, 3, 4], 3));
算法的工作原理如下:

  • 如果setsize为0,则返回单个空组合
  • 否则,通过使用setsize-1元素递归地从数组中生成不包括第一个元素的所有组合(不包括第一个元素),然后将第一个元素预先添加到每个元素中,从而生成包含第一个元素的所有组合
  • 然后,如果数组大小大于setsize(意味着不必包含第一个元素),则为列表的其余部分生成所有组合,并将它们添加到我们在第二步中生成的组合中

基本上,在每一步中,你需要考虑一个元素是否包含在组合中,并将一组代表两个选择的组合合并在一起。

该帖子的可能副本是所有可能的组合,重复元素和顺序并不重要,这是一个很好的线索,我确实读过了。但这并不能解决我的问题。谢谢,不客气。这只是阅读大量示例算法的问题,这种想法对我来说也不是天生的。
function getCombinations($array,$setize){
    //magic code which I can't figure out
    return array(sets);
}
function getCombinations($array, $setsize){  
    if($setsize == 0)
        return [[]];

    // generate combinations including the first element by generating combinations for 
    // the remainder of the array with one less element and prepending the first element:
    $sets = getCombinations(array_slice($array, 1), $setsize - 1);
    foreach ($sets as &$combo) {
        array_unshift($combo, $array[0]);
    }

    // generate combinations not including the first element and add them to the list:
    if(count($array) > $setsize)
        $sets = array_merge($sets, getCombinations(array_slice($array, 1), $setsize));

    return $sets;
}

// test:
print_r(getCombinations([1, 2, 3, 4], 3));