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 相关文章推荐
文件上传的实现
Oct 09 PHP
Views rows style模板重写代码
May 16 PHP
php中用foreach来操作数组的代码
Jul 17 PHP
php页面消耗内存过大的处理办法
Mar 18 PHP
php除数取整示例
Apr 24 PHP
yii操作session实例简介
Jul 31 PHP
PHP编程中的__clone()方法使用详解
Nov 27 PHP
项目中应用Redis+Php的场景
May 22 PHP
thinkPHP统计排行与分页显示功能示例
Dec 02 PHP
利用php生成验证码
Feb 23 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
使用Git实现Laravel项目的自动化部署
Nov 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
phpMyAdmin 安装及问题总结
2009/05/28 PHP
php引用地址改变变量值的问题
2012/03/23 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
详解微信小程序审核不通过的解决方法
2018/01/17 Javascript
jQuery zTree插件使用简单教程
2019/08/16 jQuery
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
uploadify插件实现多个图片上传并预览
2019/09/30 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
2020/08/10 Javascript
Python获取系统默认字符编码的方法
2015/06/04 Python
Python搭建FTP服务器的方法示例
2018/01/19 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
对Python 数组的切片操作详解
2018/07/02 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
Python中print函数简单使用总结
2019/08/05 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
最新pycharm安装教程
2020/11/18 Python
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
市场营销专业毕业生求职信
2014/03/26 职场文书
《望庐山瀑布》教学反思
2014/04/22 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
交通事故被告代理词
2015/05/23 职场文书
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
2021/05/29 MySQL
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL