-
- function rank($base, $temp=null)
- {
- $len = strlen($base);
- if($len <= 1)
- {
- echo $temp.$base.'
';
- }
- 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)
- {
- //echo $temp.$base.'
';
- $ret[] = $temp.$base;
- }
- else
- {
- for($i=0; $i< $len; $i)
- {
- $had_flag = false;
- for($j=0; $j<$i; $j)
- {
- if($base[$i] == $base[$j])
- {
- $had_flag = true;
- break;
- }
- }
- if($had_flag)
- {
- continue;
- }
- fsRank(substr($base, 0, $i).substr($base, $i 1, $len-$i-1), $temp.$base[$i]);
- }
- }
- return $ret;
- }
- print '
';</li>
<li>print_r(fsRank('122'));</li>
<li>print ' ';
- ?>
复制代码
介绍了全排列的递归算法,这里为大家推荐一篇php数组全排列的非递归算法实现代码,大家可以参考下。 |