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 相关文章推荐
PHP读MYSQL中文乱码的解决方法
Dec 17 PHP
Win2003服务器安全加固设置--进一步提高服务器安全性
May 23 PHP
php横向重复区域显示二法
Sep 25 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
Apr 15 PHP
php发送html格式文本邮件的方法
Jun 10 PHP
php使用Jpgraph绘制饼状图的方法
Jun 10 PHP
PHP通过串口实现发送短信
Jul 08 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
Jul 27 PHP
php单元测试phpunit入门实例教程
Nov 17 PHP
workerman结合laravel开发在线聊天应用的示例代码
Oct 30 PHP
laravel 解决多库下的DB::transaction()事务失效问题
Oct 21 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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
PHP判断手机是IOS还是Android
2015/12/09 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
用JavaScript事件串连执行多个处理过程的方法
2007/03/09 Javascript
node.js中watch机制详解
2014/11/17 Javascript
node.js中的fs.chownSync方法使用说明
2014/12/16 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
JavaScript中Require调用js的实例分享
2017/10/27 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
原生JS封装_new函数实现new关键字的功能
2018/08/12 Javascript
angularJs中json数据转换与本地存储的实例
2018/10/08 Javascript
JavaScript实现的联动菜单特效示例
2019/07/08 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
2019/09/09 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
搭建vscode+vue环境的详细教程
2020/08/31 Javascript
浅谈es6中的元编程
2020/12/01 Javascript
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
如何搜索查找并解决Django相关的问题
2014/06/30 Python
Python functools模块学习总结
2015/05/09 Python
Python实现以时间换空间的缓存替换算法
2016/02/19 Python
Python 使用requests模块发送GET和POST请求的实现代码
2016/09/21 Python
利用python画一颗心的方法示例
2017/01/31 Python
Python 判断奇数偶数的方法
2018/12/20 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
Python3实现配置文件差异对比脚本
2019/11/18 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
2014年个人工作总结模板
2014/12/15 职场文书
期中考试复习计划
2015/01/19 职场文书
拔河比赛新闻稿
2015/07/17 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript