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 相关文章推荐
php5 图片验证码实现代码
Dec 11 PHP
PHP 设置MySQL连接字符集的方法
Jan 02 PHP
PHP register_shutdown_function函数的深入解析
Jun 03 PHP
PHP验证码函数代码(简单实用)
Sep 29 PHP
CentOS6.5 编译安装lnmp环境
Dec 21 PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
May 13 PHP
PHP魔术方法的使用示例
Jun 23 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
Nov 10 PHP
浅析PHP开发规范
Feb 05 PHP
PHP filesize函数用法浅析
Feb 15 PHP
PHP levenshtein()函数用法讲解
Mar 08 PHP
laravel 使用事件系统统计浏览量的实现
Oct 16 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
WINXP下apache+php4+mysql
2006/11/25 PHP
PHP常用的缓存技术汇总
2014/05/05 PHP
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
Yii2中hasOne、hasMany及多对多关联查询的用法详解
2017/02/15 PHP
利用php的ob缓存机制实现页面静态化方法
2017/07/09 PHP
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
浅析jQuery1.8的几个小变化
2013/12/10 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
js 概率计算(简单版)
2017/09/12 Javascript
js处理包含中文的字符串实例
2017/10/11 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
《javascript少儿编程》location术语总结
2018/05/27 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
python3实现跳一跳点击跳跃
2018/01/08 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
学习python可以干什么
2019/02/26 Python
详解Python中is和==的区别
2019/03/21 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
python实现AdaBoost算法的示例
2020/10/03 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
留学自荐信
2013/10/10 职场文书
浅谈Python数学建模之固定费用问题
2021/06/23 Python
Python保存并浏览用户的历史记录
2022/04/29 Python