具有可变数量元素的数组,向上计数



我想要一个多维数组,其中每个元素都是X元素的数组-假设为3。

我想在第3个元素中从0数到y(假设是12),然后在0,0,12之后,我想让数组中的下一个元素是数组0,1,0 -以12,12,12结束

我算基数…12、完成后跳转到数组的下一个元素

0,0,0
0,0,1
...
0,0,12
0,1,0
0,1,1
0,1,2
...
0,1,12
0,2,0
...
12,12,12

好的,我可以这样做

$maxCountNumber= 12;
$i=1;
for ($j=0; $j < $maxCountNumber+1; $j++) { 
    for ($k=0; $k < $maxCountNumber+1; $k++) { 
        for ($l=0; $l < $maxCountNumber+1; $l++) { 
                print "<br/>$i: $j, $k, $l";
                $results[$i] = array($j, $k, $l);
                $i++;
        }
    }
}

但是如果我不想每次只需要3个元素,有时我想要4个元素,而不是百位,十位和单位,我想要千位,百位,十位和单位……或者7个元素呢?

我确信递归是答案,但我似乎就是无法解决这个特殊的问题。

除非有什么东西能让我用12秒而不是10秒来计算?

谢谢你的建议

这个算法预先计算了总共需要的循环次数,然后使用$i来计算每个数组位置的值。

$max= 13;
$elements = 4;
$loops = pow($max, $elements);
$main_array = array();
for($i = 0; $i < $loops; $i++){
    for($j = 0; $j < $elements; $j++){
        $main_array[$i][$j] = floor($i/pow($max,$elements-1-$j))%$max;
    }
}

这是我发现的最优雅的解决方案,只有2个嵌套循环,每次使用幂和模运算来获得所需的数组。

你只需要调整元素和/或基数。

计算3个位置的数组耗时0.014s。

计算4个位置的数组耗时0.25s。

计算5个位置的数组耗时4.08秒*

*对于5个位置,我需要增加memory_limit,我猜是因为数组变得太大了,如果您只输出数字而不是存储一个巨大的数组,这个脚本将会轻松得多。

现在,让我们看看…

$numberOfDimensions = 3;
$base = 13;
$YourArray = array();    //This array will hold the complete data.
$LastArray = array();
for($o = 0; $o < $numberOfDimensions; ++$o) //Gives us something to start with.
    $LastArray[$o] = 0;    
while($LastArray[0] < $base) {      //Makes sure, we're not going out of bounds
    $index = $numberOfDimensions - 1;
    $YourArray[] = $LastArray;      //Adds the array you filled last to the result array.
    while($index >= 0) {            //This is where things start to get interesting.
        if(++$LastArray[$index] < $base) break;  //Still in bounds, continue.
        else {
            if($index)              //Overflow for all but the first element..
                $LastArray[$index] = 0;
            --$index;               //Moving on to the previous digit.
        }
    }
}
echo "<pre>";
echo print_r($YourArray);
echo "</pre>";

唷……这对我疲惫的大脑来说比我读到问题时想象的要困难得多。这应该能行……如果您对代码有疑问,请随时提问。

我现在已经测试了它,它做了什么是预期的。在我的测试中,我遇到了一个愚蠢的错误,特此修正。抱歉耽误了您的时间。

基本递归如下:

<?php 
class StrangeBase { 
  private static function loopOnStrangeBase($place, $base, $printstr) { 
    if (($place < 0) || ($base < 0)){ return; }//edge case 
    for ($idx=0; $idx<$base; $idx++) { 
      if ($place == 0) { 
        echo "$printstr,$idxn"; 
      } else {
        if($printStr !== ''){ 
          StrangeBase::loopOnStrangeBase($place - 1, $base, $printstr.",$idx");
        } else {
          StrangeBase::loopOnStrangeBase($place - 1, $base, "$idx");
        }
      }
    } 
  }
  public static function printStrangeBase($places, $base) {
    StrangeBase::loopOnStrangeBase($places, $base, "");
  }
} 
StrangeBase::printStrangeBase(3, 12); 

现在,您可以将其修改为不是静态函数,而是保存到数组中。要做到这一点,你的数组应该"向后"增长;数组中的第一个元素是数字中最低阶的位。然后,您可以进一步修改递归函数,使其接受函数指针并运行任意代码,而不是简单地打印出它所在的位置。

相关内容

  • 没有找到相关文章

最新更新