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 相关文章推荐
ADODB的数据库封包程序库
Dec 31 PHP
php过滤危险html代码
Aug 18 PHP
php session和cookie使用说明
Apr 07 PHP
shopex主机报错误请求解决方案(No such file or directory)
Dec 27 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
Nov 01 PHP
php不允许用户提交空表单(php空值判断)
Nov 12 PHP
PHP不用递归实现无限分级的例子分享
Apr 18 PHP
CI框架中site_url()和base_url()的区别
Jan 07 PHP
PHP获取ip对应地区和使用网络类型的方法
Mar 11 PHP
php使用Jpgraph绘制柱形图的方法
Jun 10 PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 PHP
Laravel 实现密码重置功能
Feb 23 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登录环节防止sql注入的方法浅析
2014/06/30 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
thinkPHP自动验证机制详解
2016/12/05 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
js 通用javascript函数库整理
2011/08/14 Javascript
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
jquery实现点击其他区域时隐藏下拉div和遮罩层的方法
2015/12/23 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
2020/06/01 Javascript
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python通过matplotlib绘制动画简单实例
2017/12/13 Python
Anaconda下安装mysql-python的包实例
2018/06/11 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
python监控nginx端口和进程状态
2019/09/06 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
Django返回HTML文件的实现方法
2020/09/17 Python
HTML5 File接口在web页面上使用文件下载
2017/02/27 HTML / CSS
远程Wi-Fi宠物监控相机:Petcube
2017/04/26 全球购物
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
上班迟到检讨书
2014/01/10 职场文书
会计专业自我鉴定
2014/02/10 职场文书
保密工作目标责任书
2014/07/28 职场文书
身份证丢失证明
2015/06/19 职场文书
详解MindSpore自定义模型损失函数
2021/06/30 Python
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android
MySQL去除密码登录告警的方法
2022/04/20 MySQL