首页 > php代码 > PHP全排列算法实现程序代码

PHP全排列算法实现程序代码

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

简介

如1,2,3三个元素的全排列为:

1,2,3

1,3,2

2,1,3

2,3,1

3,1,2

3,2,1

共3*2*1=6种 3!

2公式

全排列数f(n)=n!(定义0!=1)

递归算法

1,2,3

1,3,2

2,1,3

2,3,1

3,2,1

3,1,2

这是由于算法只是考虑到了如何输出全排列,而没有考虑到换位是否有问题。所以我提出了解决方案,就是换位函数修改下

如 1 2 3 换位的话 ,不应该直接 3 2 1这样 ,让3和1直接换位; 而是让3排在最前后 ,1 2 依次向后

基本算法

以下介绍全排列算法四种:

(A)字典序法

(B)递增进位制数法

(C)递减进位制数法

(D)邻位对换法

实现全排列算法

<?php
header("content-type:text/html;charset=utf-8");
/**
 * @param array $a 待排列的元素集合,会动态变化
 * @param array $b 储存当前排列
 * @param array $M 待排列的元素集合,相当于一个常量,始终为初始待排列的元素集合
 */
function wholerange($a, $b, $M) {
    $range = array();
    if (count($a) > 1) {
        $d = $b;
        foreach ($a as $value) {
            $b[] = $value;
            $c = array_diff($M, $b);
            if (count($c) > 0) {
                $range[] = wholerange($c, $b, $M);
            }
            $b = $d;
        }
    } elseif (count($a) == 1) {
        foreach ($a as $value) {
            $b[] = $value;
        }
        $onerange = "";
        foreach ($b as $value) {
            $onerange.= $value;
        }
        $range[] = $onerange;
    }
    return $range;
}
/**
 * 递归输出数组
 *
 * @param array $arr 待输出的数组
 * @return int 返回数组元素个数
 */
function recursionarray($arr) {
    $i = 0;
    foreach ($arr as $value) {
        if (is_array($value)) {
            $i+= recursionarray($value);
        } else {
            echo $value . "<br/>";
            $i++;
        }
    }
    return $i;
}
$a = array(
    'A',
    'B',
    'C',
    'D'
);
$b = array();
$range = wholerange($a, $b, $a);
$count = recursionarray($range);
echo "总共有" . $count . "排列";
?>


教程网址:http://www.phprm.com/code/75708.html

欢迎收藏∩_∩但请保留本文链接。

标签:foreach

相关文章

发表留言