【问题标题】:php recursive incrementphp递归增量
【发布时间】:2012-02-10 12:50:59
【问题描述】:

我有一个这样的数组:

Array ( [0] => 0 [1] => 0 [2] => 0 );

有 3 个元素(3 个整数),我希望它们从 0 递增到 36;

我知道最好的方法是递归,因为必须检查每个元素是否处于最大值 ( 36 ),如果是,它将最后一个元素设置为 0 并递增前一个元素。

所以我的数组基本上是这样的:

Array ( [0] => 0 [1] => 0 [2] => 0 );
Array ( [0] => 0 [1] => 0 [2] => 1 );
Array ( [0] => 0 [1] => 0 [2] => 2 );
...
Array ( [0] => 0 [1] => 0 [2] => 36 );
Array ( [0] => 0 [1] => 1 [2] => 0 );
Array ( [0] => 0 [1] => 1 [2] => 1 );
....
Array ( [0] => 0 [1] => 1 [2] => 36 );
Array ( [0] => 0 [1] => 2 [2] => 0 );

ETC ETC ETC

但我不知道如何递归地执行此操作!

但是,该解决方案还需要适用于 4 个元素和 5 个元素以及 6 个等!

谁能给我一些指导?

【问题讨论】:

  • 这应该代表一个 base-37 数字吗?

标签: php recursion increment


【解决方案1】:

类似于 Timurs 的答案,但效率稍高一些,并且基数可变。

$array = array(0, 0, 0);

function bloop(&$array, $amount, $base = 37)
{
    $i = count($array) - 1;
    while ($i >= 0) {
        $array[$i] = $amount % $base;
        $amount = ($amount - $array[$i--]) / $base;
    }
}

bloop($array, (37 * 37 * 2) + (37 * 5) + 8); // 2, 5, 8

var_dump($array);

【讨论】:

    【解决方案2】:

    如果您只想要一个基数为 37 的数字,请考虑改用 base_convert

    【讨论】:

    • 基本转换最多有 36 个??
    • 好点。这似乎是一个很大的巧合……这是作业吗?
    【解决方案3】:
    $limit = 36;
    $step  = 1;
    $array = array ( 0 , 0 , 0 );
    
    
    function increment( array $array , $limit , $step )   {
        $result = $array = array_values( $array );
        while( count( array_keys( $result , $limit ) ) != count( $array ) ) {
            for( $i = 1 ; $i <= count( $result ) ; $i++ ) {
                 while( $result[ count( $result )-$i ] < $limit )  {
                     $result[ count( $result )-$i ] += $step;
                 }
            }
        }
        return $result;
    }
    
    var_dump( increment( $array , $limit , $step ) );
    

    【讨论】:

      【解决方案4】:
      function fill($limit){
         $ret = array();
         while($i<=$limit){
            while($j<=$limit){
               while($k<=$limit){
                  $ret[] = array($i,$j,$k);
                  print_r($a);
                  $k++;
               }
               $j++;
            }
            $i++;
         }
         return $ret;
      }
      
      fill(36);
      

      【讨论】:

        【解决方案5】:
        function increment(&$array,$num){
            $plus = $num;
            for( $i=count($array)-1;$i>=0;$i-- ){
                $array[$i] += $plus;
                if( $array[$i]>36 ){
                    $tmp = $array[$i]%37;
                    $plus = ($array[$i]-$tmp)/37;
                    $array[$i] = $tmp;
                }else{
                    break;
                }
            }
        }
        
        // init array
        $array = array( 0,0,0 );
        // increment 100 times
        increment($array,100);
        
        var_dump($array);
        

        【讨论】:

        • 这是完美的!然而,它正确地从 (0, 0, 0) - (0, 0, 36) 开始,但是在 0, 0, 36 之后它变为 0, 1, 1 而不是 0, 1, 0 ......我怎么能修改这个?
        • 哦...% 的基础错误...编辑了我的帖子
        【解决方案6】:

        这个呢??

        <?php
        $arr = array(0=>0,2=>0);
        foreach (range(0,36) as $f )
        {
           echo "<pre>";print_r(array_pad(array($f),3,0));
           echo "<pre>";print_r(array_pad(array($f),-3,0)); 
           $arr_n = $arr+array(1=>$f);
           ksort($arr_n);
           echo "<pre>"; print_r($arr_n);
        }
        
        ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-05
          • 2019-03-02
          • 1970-01-01
          • 2015-03-14
          • 2020-11-26
          • 2021-11-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多