Забавно, но я действительно застрял с этой, вероятно, простой задачей.
Что мне нужно очень просто
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
не совсем то, что мне нужно
Важно, что мне нужно установить длину и минимальное и максимальное значения для результирующих чисел.
Любые советы?
Ваш последний образец может работать. За исключением первого результата 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);
}
}
Вы можете реализовать одометр, который увеличивает последнюю цифру. Когда цифра переносится, следующая цифра увеличивается до тех пор, пока вы не достигнете начального состояния, то есть до тех пор, пока число для переноса не выйдет за пределы размера вашего шаблона:
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-иш. Извините за это.)
Я могу ошибаться, но я вижу, что похоже, что это работает))
$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;}
}