Получить все вариации определенных чисел определенной длины и определенных минимальных и максимальных значений?

Забавно, но я действительно застрял с этой, вероятно, простой задачей.

Что мне нужно очень просто

11111
11112
11121
11211

и так далее.

Это то, что я сделал до сих пор (но, конечно, это не работает)

 $patterns=array_fill(0,5,'1'); //'1' is a minimal digit (but it can be higher)
$cnt=0;
$maxV=3; //max digit (can be any)
$inc='Y';
while($cnt++<100){
for ($i = count($patterns)-1; $i>0; $i--){
If($patterns[$i]<$maxV && $inc){$patterns[$i]++; $inc='';}
If($patterns[$i]==$maxV){$patterns[$i]=1; $inc='Y';}
}
echo implode($patterns),'<br>';
If($i==0){$inc='Y';}

}



the result is

112
121
122
111
112
121
122
111
112
121
122
111

не совсем то, что мне нужно

Важно, что мне нужно установить длину и минимальное и максимальное значения для результирующих чисел.

Любые советы?

1

Решение

Ваш последний образец может работать. За исключением первого результата 1111111, Это делает слишком много работы. Вы перебираете весь массив для каждого приращения. Также array_sum собирается зацикливаться и на массиве.

Более простой пример с использованием рекурсии, который работает:

function printPattern($len, $min, $max){
printPatternRec($len, $min, $max, array(), 0);
}
function printPatternRec($len, $min, $max, $pattern, $cur){
if($cur==$len){
echo implode($pattern),'<br>';
return;
}
for($val=$min;$val<$max;$val++){
$pattern[$cur]=$val;
printPatternRec($len, $min, $max, $pattern, $cur+1);
}
}
1

Другие решения

Вы можете реализовать одометр, который увеличивает последнюю цифру. Когда цифра переносится, следующая цифра увеличивается до тех пор, пока вы не достигнете начального состояния, то есть до тех пор, пока число для переноса не выйдет за пределы размера вашего шаблона:

function echo_combo($size, $base)
{
$pattern = array_fill(0, $size, 0);
$ix = 0;

while ($ix < $size) {
$i = $size;

while ($i--) {
echo $pattern[$i] + 1;
}
echo "<br />";

$pattern[$ix]++;
while ($pattern[$ix] == $base) {
$pattern[$ix] = 0;
$ix++;
if ($ix == $size) return;
$pattern[$ix]++;
}
$ix = 0;
}
}

echo_combo(5, 2);

(Я не PHP человек, поэтому код, вероятно, выглядит не очень php-иш. Извините за это.)

1

Я могу ошибаться, но я вижу, что похоже, что это работает))

$patternlen=8;
$maxV=3;
$patternsMap=array_fill(0,$patternlen,'1');
$cnt=0;
$inc='Y';
while($cnt++<100000){
$inc='Y';
for($i = count($patternsMap)-1; $i>=0; $i--){
If($inc){
$patternsMap[$i]++; $inc='';
If($patternsMap[$i]==$maxV){$patternsMap[$i]=1; $inc='Y';}
}
}

echo $cnt,'. ',implode($patternsMap),' ',array_sum($patternsMap),'<BR>';

If($patternlen*$maxV-$patternlen<=array_sum($patternsMap)){break;}

}
0