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 session常见问题集锦及解决办法总结
Mar 18 PHP
PHP控制网页过期时间的代码
Sep 28 PHP
PHPCMS的使用小结
Sep 20 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
Mar 19 PHP
php Rename 更改文件、文件夹名称
May 24 PHP
ThinkPHP自动验证失败的解决方法
Jun 09 PHP
php站内搜索并高亮显示关键字的实现代码
Dec 29 PHP
coreseek 搜索英文的问题详解
Jun 08 PHP
浅析php中常量,变量的作用域和生存周期
Aug 10 PHP
变量在 PHP7 内部的实现(二)
Dec 21 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
Windows服务器中PHP如何安装redis扩展
Sep 27 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
第4章 数据处理-php正则表达式-郑阿奇(续)
2011/07/04 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
laravel请求参数校验方法
2019/10/10 PHP
jQuery is()函数用法3例
2014/05/06 Javascript
js淡入淡出的图片轮播效果代码分享
2015/08/24 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
功能强大的Bootstrap使用手册(一)
2016/08/02 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
实例分析js事件循环机制
2017/12/13 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
uniapp实现可滑动选项卡
2020/10/21 Javascript
手写Vue2.0 数据劫持的示例
2021/03/04 Vue.js
Python3学习urllib的使用方法示例
2017/11/29 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
python实现列表的排序方法分享
2019/07/01 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
给我一面国旗 python帮你实现
2019/09/30 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
Python中Qslider控件实操详解
2021/02/20 Python
美国婴儿和儿童家具网上商店:ABaby.com
2018/07/02 全球购物
总经理助理职责
2014/02/04 职场文书
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
快递员岗位职责
2014/09/12 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
运动员加油词
2015/07/18 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书