+ -
当前位置:首页 → 问答吧 → 发表个递归求全排列

发表个递归求全排列

时间:2006-12-31

来源:互联网

算法说明
假如字符
123

先把1留下,

       然后在把2,3作为一个数组递归获得两个排列$rs_array=("23","32");

                 然后在遍历$rs_array,每个元素于留下的1合并得到$rs_array("123","132");

然后在把2留下,
      
      把1,3作为一个数组递归获得两个排列$rs_array=("13","31");

               然后在遍历$rs_array,每个元素于留下的2合并得到$rs_array("123","132","213","231");
再把3留下,
     
      把1,2作为一个数组递归获得两个排列$rs_array=("12","21");
           
               然后在遍历$rs_array,每个元素于留下的2合并得到$rs_array("123","132","213","231","312","321");

OK?
思想就在这里,高手的话,改改,让运行速度更快
复制PHP内容到剪贴板
PHP代码:

<?php
function gosort($array,$len){
    if($len<=2){
        $rs_array[0]=$array[0].$array[1];
        $rs_array[1]=$array[1].$array[0];
    }else{
        for($i=0;$i<$len;$i++){
            $leave_one=$array[$i];
            $k=0;
            for($j=0;$j<$len;$j++){
                if($j==$i){
                    continue;
                }else{
                    $tosent[$k]= $array[$j];
                    $k++;
                }
            }
            $fetch = gosort($tosent,$len-1);
            foreach($fetch as $comein){
                $rs_array[] = $leave_one.$comein;
            }
        }
    }
    return $rs_array;
}

//example
$array =array("a","b","c","d","e");
set_time_limit(0);
$begin = explode(' ', microtime());
$comeonbaby = gosort($array,5);
$f=0;
foreach($comeonbaby as $menu){
    echo $menu."<br>";
    $f++;
}
echo $f;
$end = explode(' ', microtime());
$time = ($end[0]+$end[1]) - ($begin[0]+$begin[1]);
echo '<br>';
echo "执行时间:{$time}秒";
?>

[ 本帖最后由 muqiao 于 2006-12-30 23:25 编辑 ]

作者: muqiao   发布时间: 2006-12-30

算法很强嘛

作者: leehui1983   发布时间: 2006-12-30

热门下载

更多