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 相关文章推荐
windows下PHP APACHE MYSQ完整配置
Jan 02 PHP
php 验证码制作(网树注释思想)
Jul 20 PHP
php实现的遍历文件夹下所有文件,编辑删除
Jan 05 PHP
PHP 金额数字转换成英文
May 06 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
Jun 25 PHP
php实现可以设置中奖概率的抽奖程序代码分享
Jan 19 PHP
四种php中webservice实现的简单架构方法及实例
Feb 03 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
Jul 10 PHP
大家在抢红包,程序员在研究红包算法
Aug 31 PHP
PHP简单字符串过滤方法示例
Sep 04 PHP
php获取当前url地址的方法小结
Jan 10 PHP
PHP的Trait机制原理与用法分析
Oct 18 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 session和cookie使用说明
2010/04/07 PHP
PHP生成数组再传给js的方法
2014/08/07 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
Yii2 rbac权限控制之rule教程详解
2016/06/23 PHP
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
JS代码实现根据时间变换页面背景效果
2016/06/16 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
了解JavaScript中的选择器
2019/05/24 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
python模拟事件触发机制详解
2018/01/19 Python
python交换两个变量的值方法
2019/01/12 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
Python实现的微信支付方式总结【三种方式】
2019/04/13 Python
PyQtGraph在pyqt中的应用及安装过程
2019/08/04 Python
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
使用python自动追踪你的快递(物流推送邮箱)
2020/03/17 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
Keras搭建自编码器操作
2020/07/03 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
python热力图实现简单方法
2021/01/29 Python
Zipadee-Zip襁褓过渡毯:Sleeping Baby
2018/12/30 全球购物
世界上最全面的草药补充剂和顶级品牌维生素网站:HerbsPro
2019/01/20 全球购物
应届生程序员求职信
2013/11/05 职场文书
外贸销售员求职的自我评价
2013/11/23 职场文书
司马光教学反思
2014/02/01 职场文书
个人求职信范文
2014/05/24 职场文书
五年级作文之想象作文
2019/10/30 职场文书
SQL SERVER存储过程用法详解
2022/02/24 SQL Server