Php 得到给定Y个数的X个数的每个组合?
我遇到了一道数学题,因为我无法编写逻辑程序 让我用一个例子来解释: 假设我有4个洞和3个弹珠,这些洞是有序的,我的弹珠是A,B和C,也是有序的 我需要得到每个可能的有序组合: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
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));