php全排列递归算法代码


Posted in PHP onOctober 09, 2012

算法原理

如果用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)
    {
        //echo $temp.$base.'<br/>';
        $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 '<pre>';
print_r(fsRank('122'));
print '</pre>';

PHP 相关文章推荐
在Zeus Web Server中安装PHP语言支持
Oct 09 PHP
SSI指令
Nov 25 PHP
一个图形显示IP的PHP程序代码
Oct 19 PHP
基于Windows下Apache PHP5.3.1安装教程
Jan 08 PHP
PHP在特殊字符前加斜杠的实现代码
Jul 17 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
Jul 08 PHP
PHP 读取文本文件内容并分页显示
Jan 02 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
Feb 28 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
详解将数据从Laravel传送到vue的四种方式
Oct 16 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
Mar 02 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
Apr 26 PHP
php列出一个目录下的所有文件的代码
Oct 09 #PHP
解析百度搜索结果link?url=参数分析 (全)
Oct 09 #PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 #PHP
php随机输出名人名言的代码
Oct 07 #PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 #PHP
PHP面向对象学习笔记之一 基础概念
Oct 06 #PHP
php生成局部唯一识别码LUID的代码
Oct 06 #PHP
You might like
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
php 获取select下拉列表框的值
2010/05/08 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
php采集文章中的图片获取替换到本地(实现代码)
2013/07/08 PHP
PHP文件上传主要代码讲解
2013/09/30 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
JS 日期验证正则附asp日期格式化函数
2009/09/11 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
javascript页面倒计时实例
2015/07/25 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
微信小程序实现图片放大预览功能
2020/10/22 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
在Vue 中获取下拉框的文本及选项值操作
2020/08/13 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
Python的面向对象思想分析
2015/01/14 Python
深入理解Python装饰器
2016/07/27 Python
python3监控CentOS磁盘空间脚本
2018/06/21 Python
详解python logging日志传输
2020/07/01 Python
CSS伪类与CSS伪元素的区别及由来具体说明
2012/12/07 HTML / CSS
CSS 说明横向进度条最后显示文字的实现代码
2020/11/10 HTML / CSS
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
AVI-8手表美国官方商店:AVI-8 USA
2019/04/10 全球购物
GWebs公司笔试题
2012/05/04 面试题
历史学专业推荐信
2013/11/06 职场文书
制衣厂各岗位职责
2013/12/02 职场文书
教你打造完美的创业计划书
2014/01/06 职场文书
国际贸易系求职信
2014/08/09 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS
CSS基础详解
2021/10/16 HTML / CSS