我是PHP的初学者(以及一般的编程)。 为了测试我到目前为止所学到的东西,我编写了这段代码,它打印了一定数量的面具的一组骰子的所有可能组合。 (你最后会找到代码)。
我想要做的是根据$dicenumber
变量动态更改嵌套for循环的数量。现在它只能处理3个骰子,因为代码是:
for ($d1=1; $d1 <= $d1value ; $d1++) {
for ($d2=1; $d2 <= $d2value ; $d2++) {
for ($d3=1; $d3 <= $d3value ; $d3++) {
array_push(${sum.($d1+$d2+$d3)}, "$d1"."$d2"."$d3");
}
}
}
但是我想改变它,例如,如果$dicenumber
是2
,它会产生类似的结果:
for ($d1=1; $d1 <= $d1value ; $d1++) {
for ($d2=1; $d2 <= $d2value ; $d2++) {
array_push(${sum.($d1+$d2)}, "$d1"."$d2");
}
}
我希望代码可以处理任何数量$dicenumber
,无限制。环顾四周,似乎我必须添加某种递归代码,但我不知道如何做到这一点。有小费吗?此外,任何关于我一般错误的反馈都会非常有帮助!谢谢!
<?php
//defines the number and type of dice
$dicenumber = 3;
$dtype = 6;
//defines the maximum value of every die
for ($i=1; $i <=$dicenumber ; $i++) {
${d.$i.value} = $dtype;
}
//defines and array for each possible sum resulting from the roll of the given number of dice.
for ($i=$dicenumber; $i <= ($dtype*$dicenumber) ; $i++) {
${sum.$i} = array();
}
//the troublesome piece of code I want to change
for ($d1=1; $d1 <= $d1value ; $d1++) {
for ($d2=1; $d2 <= $d2value ; $d2++) {
for ($d3=1; $d3 <= $d3value ; $d3++) {
array_push(${sum.($d1+$d2+$d3)}, "$d1"."$d2"."$d3");
}
}
}
//prints all the possible roll combinations, each line lists combination that share the same sum
for ($i=$dicenumber; $i <= ($dtype*$dicenumber); $i++) {
print join(" ", ${sum.$i})."<br />";
}
?>
答案 0 :(得分:1)
这里我们有一个双功能过程。第一个函数buildArrays
以适当的格式创建数组,以提供给第二个函数allCombinations
。因此,对于这个使用3 d6的示例,buildArrays将生成一个与此相当的数组:
$data = array(
array(1, 2, 3, 4, 5, 6),
array(1, 2, 3, 4, 5, 6),
array(1, 2, 3, 4, 5, 6));
我会警告你,当你增加骰子的数量和边数时,可能的组合数量会呈指数增长!这意味着您可以在服务器上放置非常大的需求,并且超时和最大内存限制将很快发挥作用。生成的数组可能非常非常大,并且快速消耗超过最大内存限制。那就是说,我们走了:
function buildArrays($dicenumber, $dtype){
for ($i = 0; $i<$dicenumber; $i++){
$tmp = array();
for ($j = 1; $j<=$dtype; $j++){
$tmp[] = $j;
}
$data[$i] = $tmp;
}
return $data;
}
function allCombinations($data){
$result = array(array()); //this is crucial, dark magic.
foreach ($data as $key => $array) {
$new_result = array();
foreach ($result as $old_element){
foreach ($array as $element){
if ($key == 0){
$new_result[] = $element;
} else {
$new_result[] = $old_element.$element;
}
}
$result = $new_result;
}
}
return $result;
}
//set variables
$dicenumber = 3;
$dtype = 6;
//set_time_limit(0); //You may need to uncomment this for large values.
//call functions
$data = buildArrays($dicenumber, $dtype);
$results = allCombinations($data);
//print out the results
foreach ($results as $result){
echo $result."<br/>";
}
N.B。这个答案是the cartesian product code
的变体答案 1 :(得分:0)
如果您已经学习了函数,则可以进行递归调用并跟踪您所处的数字,然后在每次调用函数时递增它(并在您按下#后结束循环)。 understanding basic recursion