获取某些数字的某些长度和某些最小值和最大值的所有变化?

时间:2015-11-27 16:42:31

标签: php algorithm combinatorics

很有趣,但我真的很难接受这个简单的任务。

我需要的是非常简单的

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

并不像我需要的那样

重要的是,我需要为结果数字设置长度,最小值和最大值。

有任何建议吗?

3 个答案:

答案 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;}

}