繁体   English   中英

php中阶乘的排列

[英]Permutation of factorial in php

不知道怎么解释。 但也许下面的例子会让你理解我的问题是什么。

示例:

我有一个包含3个元素的数组。

$elements = array( 'A', 'B', 'C' );

排列将是3 in 3.所以结果是:

A-B-C ; A-C-B ; B-A-C ; B-C-A ; C-A-B; C-B-A

我不希望任何排列为3比3或1比3的排列,如示例中所示。 因此,如果我在数组中有4个元素,则排列为4中的4。依此类推...

(我认为排列的数目是3!= 1 * 2 * 3 = 6个排列,4!= 1 * 2 * 3 * 4 = 24个排列...这就是为什么我称为阶乘排列的原因。)

如果还有其他与我的问题类似的问答,请告诉我

使用递归函数:

function permutations($elements) {
    if(count($elements)<2) return $elements;

    $newperms= array();
    foreach($elements as $key=>$element) {
        $newelements= $elements;
        unset($newelements[$key]);

        $perms= permutations($newelements);
        foreach($perms as $perm) {
            $newperms[]= $element."-".$perm;
        }
    }
    return $newperms;
}

没有测试,所以仍然有你的工作;-)

不确定您需要什么,但是您是否要产生这些排列?

这应该使您入门,它将对所需的任何大小的集执行完整排列。 添加了一些注释,你应该能够理解

$array = array('A','B','C', 'D'); 
$permutations = array($array);
$perm_pool = range(0, count($array)-1);

function getPermutation($p, $size){
    // we pass in an array of integers, basically pointers, we want to see when we've fully reversed the set
    for ($i = $size-1; $p[$i] >= $p[$i+1]; $i--){}
    // the array starts at [1,2,3,4], when we've reached [4,3,2,1], we're done.
    if ($i == -1) { return false; }

    // slide down to the next largest number, this will be our next swap
    for ($j = $size; $p[$j] <= $p[$i]; $j--) {}

    // swap it
    $tmp = $p[$i];
    $p[$i] = $p[$j];
    $p[$j] = $tmp;

    // reverse the arrangement by swapping the head and tails
    for ($i++, $j = $size; $i < $j; $i++, $j--){
        $tmp = $p[$i];
        $p[$i] = $p[$j];
        $p[$j] = $tmp;  
    }
    return $p;
}

$i=1;
while($perm_pool=getPermutation($perm_pool, count($array)-1)){
    foreach($perm_pool as $p){
        $permutations[$i][] = $array[$p];
    }
    $i++;

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM