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
PHP中通过加号合并数组的一个简单方法分享
Jan 27 PHP
解析PHP缓存函数的使用说明
May 10 PHP
php中的boolean(布尔)类型详解
Oct 28 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
PHP MVC框架skymvc支持多文件上传
May 26 PHP
PHP+iframe图片上传实现即时刷新效果
Nov 18 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
php提交表单时保留多个空格及换行的文本样式的方法
Jun 20 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
Apr 15 PHP
php生成短网址/短链接原理和用法实例分析
May 29 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中echo和print的区别
2014/08/28 PHP
PHP使用json_encode函数时不转义中文的解决方法
2014/11/12 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
教你在header中隐藏php的版本信息
2016/08/10 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
JQuery中的ready函数冲突的解决方法
2010/05/17 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
2016/05/03 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
Js经典案例的实例代码
2018/05/10 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
js实现图片区域可点击大小随意改变(适用移动端)代码实例
2019/09/11 Javascript
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
python fabric实现远程操作和部署示例
2014/03/25 Python
Python写的Discuz7.2版faq.php注入漏洞工具
2014/08/06 Python
Python中的rfind()方法使用详解
2015/05/19 Python
python创建属于自己的单词词库 便于背单词
2019/07/30 Python
Python中turtle库的使用实例
2019/09/09 Python
python打开使用的方法
2019/09/30 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
银行实习生的自我评价
2013/12/09 职场文书
餐厅总经理岗位职责
2013/12/31 职场文书
优秀班干部事迹材料
2014/01/26 职场文书
职务聘任书范文
2014/03/29 职场文书
活动总结怎么写
2014/04/28 职场文书
党支部季度考核意见
2015/06/02 职场文书
LyScript实现绕过反调试保护的示例详解
2022/08/14 Python