1

2つの変数を持つPHPページがあります:$nbRank$nbNumeric。これらの2つの変数に応じて、既存のすべての組み合わせを含む配列を生成したいと思います。例えば:

もし私が持っている$nbRank = 3とし$nbNumeric = 2たら:

0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
0 2 1
0 2 2
1 0 0
1 0 1
1 0 2
1 1 0
1 1 1
1 1 2
1 2 0
1 2 1
1 2 2
2 0 0
2 0 1
2 0 2
2 1 0
2 1 1
2 1 2
2 2 0
2 2 1
2 2 2

そのため、最終結果を得るためにさまざまなループと数式を作成しましたが、機能しません。これは私がしたことです:

$result = array();

$nbIntRank = 0;
$nbIntNumeric = 0;
$nbRank = array();
$nbNumeric = array();

$nb_rangs = 3;
$nb_chiffres = 2;

for ($i = 1; $i <= $nb_rangs; $i++){
    $nbRank[$i] = 0;
}

$nbIntRank = count($nbRank);

for ($i = 0; $i <= $nb_chiffres; $i++){
    $nbNumeric[$i] = $i;
}

$nbIntNumeric = count($nbNumeric);

$algo = ($nb_rangs * ($nb_chiffres + 1)) * ($nb_rangs * ($nb_chiffres + 1));
$nbLine = $algo / ($nb_rangs);

$occ = 0;
for ($i = 0; $i < $nbLine; $i++){
    foreach ($nbRank as $nbrItem => $nbrValue){
        $result[$i][] = $nbrValue;
        $occ++;
    }
}

echo '#############<br />';
echo '### DATAS ###<br />';
echo '#############<br /><br />';

echo '- Nb Elements : '.$algo.'<br />';
echo '- Nb Lines : '.$nbLine.'<br />';
echo '- Nb Valuable Occurency : '.$occ.'<br />';

echo '<br /><hr /><br />';
echo '##############<br />';
echo '### PARSER ###<br />';
echo '##############<br /><br />';

echo '<pre>';
var_dump($result);
echo '</pre>';

空の値(81個の値、3要素の27行)で最終的な配列を作成できましたが、0しか含まれていません。

4

3 に答える 3

2

あなたは疑似コードで問題ないことを示しました..申し訳ありませんが、あなたのphpコードの特定の修正を提供することはできませ.

再帰の各レベルで、すべての可能性を試し、同じ関数を呼び出して、1 つ小さいサイズのすべての組み合わせを見つけます

擬似コード:

findCombinations(range,size,sol,resultList):
  if (size ==0): #base clause
     resultList.append(copy(sol)) #making a copy of sol and appending it as a solution
     return
  for each i in (0,range):
     sol.append(i)
     findCombinations(range,size-1,sol,resultList) #recursive invokation, with smaller size
     sol.deleteLast() #clean up environment before next calls

findCombinations(3,3,[],resultList)where[]は単なる空のリストで呼び出しresultList、アルゴリズムが完了すると組み合わせのリストを保持します。この呼び出しは、要素 0、1、2 を持つサイズ 3 のすべての組み合わせを取得します。

複雑さに関する注意: 可能性の数は [O(range size )] 指数関数的に増加しているため、たとえば 20,20 で呼び出そうとすると、どのような解決策にも [非常に長い] 時間がかかる場合があります。

于 2012-04-13T23:39:51.643 に答える
2
$nbRank = 3;
$nbNumeric = 2;

foreach (range(0, base_convert(str_pad('', $nbRank, $nbNumeric), $nbNumeric+1, 10)) as $i) {
  echo str_pad(base_convert($i, 10, $nbNumeric+1), 3, 0, STR_PAD_LEFT) . PHP_EOL;
}

簡単なアイデア: 0 から X までのすべての数値を$nbNumericbase で取得する必要があるため、最大数を 10 を基数に変換し、一般的な 10 を基数とする演算子で反復処理し、$nbNumeric再度基数に変換します。

おそらくもっと読みやすいですが、実際にはまったく同じです

$nbRank = 3;
$nbNumeric = 2;

// Top is "base_convert(222, 3, 10);" and therefore the upper limit
$top = base_convert(str_pad('', $nbRank, $nbNumeric), $nbNumeric+1, 10);
for ($i = 0; $i <= $top; $i++) {
    echo str_pad(base_convert($i, 10, $nbNumeric+1), 3, 0, STR_PAD_LEFT) . PHP_EOL;
}
于 2012-04-13T23:45:03.837 に答える
0

再帰的な解決策は次のとおりです。

$nbRank = 3;
$nbNumeric = 2;

function getCombinations ($length, $min, $max, $aStartingCombinations)
{
    if ($length == 1)
    {
        return range ($min, $max);
    }

    $final = array ();
    foreach (getCombinations ($length - 1, $min, $max, $aStartingCombinations) as $combination)
    {
        for ($i = $min; $i <= $max; $i++)
        {
            $final [] = $combination . $i;
        }
    }
    return $final;
}

print_r (getCombinations ($nbRank, 0, $nbNumeric, array ()));
于 2012-04-13T23:41:54.633 に答える