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实现批量查询清除一句话后门的代码
Jan 20 PHP
PHP 用数组降低程序的时间复杂度
Dec 04 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
Sep 13 PHP
YII实现分页的方法
Jul 09 PHP
Yii中render和renderPartial的区别
Sep 03 PHP
PHP使用xmllint命令处理xml与html的方法
Dec 15 PHP
微信自定义菜单的处理开发示例
Apr 16 PHP
php生成gif动画的方法
Nov 05 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
Dec 12 PHP
解决PHP上传非标准格式的图片pjpeg失败的方法
Mar 12 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
May 24 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+javascript模拟Matrix画面
2006/10/09 PHP
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
PHP基本语法总结
2014/09/06 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
jQuery仿移动端支付宝键盘的实现代码
2018/08/15 jQuery
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
Vue + element 实现多选框组并保存已选id集合的示例代码
2020/06/03 Javascript
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
python图书管理系统
2020/04/05 Python
Pandas实现数据类型转换的一些小技巧汇总
2018/05/07 Python
Python函数中不定长参数的写法
2019/02/13 Python
python实现简单日期工具类
2019/04/24 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
英国领先的杂志订阅网站:Magazine.co.uk
2018/01/25 全球购物
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
森林防火工作方案
2014/02/14 职场文书
周年庆典主持词
2014/04/02 职场文书
学校2014年度工作总结
2014/12/06 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
python创建字典及相关管理操作
2022/04/13 Python