很有趣,但我真的很难接受这个简单的任务。
我需要的是非常简单的
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
并不像我需要的那样
重要的是,我需要为结果数字设置长度,最小值和最大值。
有任何建议吗?
答案 0 :(得分: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人,所以代码可能看起来不是很好。很抱歉。)
答案 1 :(得分: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);
}
}
答案 2 :(得分:0)
我可能错了,但我觉得它看起来很有效))
$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;}
}