如何在不重复给定范围的情况下打印所有可能的变化?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不重复给定范围的情况下打印所有可能的变化?相关的知识,希望对你有一定的参考价值。

这就是我得到的:

<?php 
// Program to print all 
// combination of size r 
// in an array of size n 
function printCombinations($arr, $n, $r) { 
    $data = []; 
    combinationUtil($arr, $data, 0, $n - 1, 0, $r); 
} 

function combinationUtil($arr, $data, $start, $end, $index, $r) { 
    if ($index == $r) { 
        for ($j = 0; $j < $r; $j++) {
            echo $data[$j]; 
        }
        echo "<br>"; 

        return; 
    } 

    for ($i = $start; $i <= $end && $end - $i + 1 >= $r - $index; $i++) { 
        $data[$index] = $arr[$i]; 
        combinationUtil($arr, $data, $i + 1, $end, $index + 1, $r); 
    } 
} 


$arr = [
    1,
    2,
    3,
    4,
    5
];
$r = 3; 
$n = count($arr); 
printCombinations($arr, $n, $r);

它给出此输出:

123
124
125
134
135
145
234
235
245
345

我需要的是:

123
124
125
132
134
135
142
143
145
152
153
154
213
214
215
231
234
235
241
243
245
251
253
254
312
314
315
321
324
325
341
342
345
351
352
354
412
413
414
415
421
423
425
431
432
435
451
452
453
512
513
514
521
523
524
531
532
534
541
542
543
答案

您可以使用递归方法,在数组上进行迭代,并在每次迭代中通过删除当前元素并在其之前添加返回的变体来调用自身。

类似这样的东西:

<?php
function variation_without_repetition ($array,$items){
    if($items == 0 || count($array) == 0) return [[]];
    $variations = [];
    foreach($array as $index => $item){
        $array_remaining = $array;
        array_splice($array_remaining,$index,1);
        foreach(variation_without_repetition($array_remaining,$items - 1) as $variation){
            array_unshift($variation,$item);
            $variations[] = $variation;
        }
    }
    return $variations;
}

$variations = variation_without_repetition([1,2,3,4,5], 3);
foreach($variations as $variation){
    echo implode($variation);
    echo "<br>
";
}
?>

以上是关于如何在不重复给定范围的情况下打印所有可能的变化?的主要内容,如果未能解决你的问题,请参考以下文章

在不指定元素数量的情况下获得逻辑变量的所有可能组合[重复]

在不重复的范围内生成随机数

(Flutter) 如何在不按“完成”的情况下自动监听 TextField 中的变化?

如何在不使用内置函数的情况下计算数字的平方根? [重复]

如何在不重复自己的情况下使该算法更懒惰?

如何在不使用表单的情况下从 jsp 调用 servlet