рекурсивный прирост php - PullRequest
1 голос
/ 10 февраля 2012

У меня есть такой массив:

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 и т. Д. И т. Д.

Кто-нибудь может дать мне какое-то руководство?

Ответы [ 6 ]

2 голосов
/ 10 февраля 2012

Аналогично ответу Тимурса, но несколько более эффективен и требует переменной базы.

$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 голосов
/ 10 февраля 2012
$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 ) );
2 голосов
/ 10 февраля 2012

Если вам нужен только номер base-37, рассмотрите вариант использования base_convert .

1 голос
/ 10 февраля 2012

что по этому поводу?

<?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);
}

?>
1 голос
/ 10 февраля 2012
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);
1 голос
/ 10 февраля 2012
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);
...