PHP 代码:php 全排列递归算法代码
算法原理
如果用 P 表示 n 个元素的全排列,而 Pi 表示 n 个元素中不包含元素 i 的全排列,(i)Pi 表示
在排列 Pi 前面加上前缀 i 的排列,那么 n 个元素的全排列可递归定义为:
① 如果 n=1,则排列 P 只有一个元素 i;
② 如果 n>1,则全排列 P 由排列(i)Pi 构成;
根据定义,可以看出如果已经生成(k-1)个元素的排列 Pi,那么 k 个元素的排列可以在
每个 Pi 前面加上元素 i 而生成。
代码实现
代码如下:
function
rank(
$base
,
$temp
=null)
{
$len
=
strlen
(
$base
);
if
(
$len
<= 1)
{
echo
$temp
.
$base
.'<br/>';
}
else
{
for
(
$i
=0;
$i
<
$len
; ++
$i
)
{
rank(
substr
(
$base
, 0,
$i
).
substr
(
$base
,
$i
+1,
$len
-
$i
-1),
$temp
.
$base
[
$i
]);
}
}
}
rank('123');
不过,经多次测试运行结果,发现存在一个问题:若是存在相同的元素,则全排列有重
复。
例如'122'的全排列只有三种情况:'122'、'212'、'221';上面方法却有重复。
略修改,加个判断重复的标志,解决了问题(代码如下):
代码如下:
function
fsRank(
$base
,
$temp
=null)
{
static
$ret
=
array
();
$len
=
strlen
(
$base
);
if
(
$len
<= 1)
{