background image

 

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)

    

{