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 相关文章推荐
建站常用13种PHP开源CMS比较
Aug 23 PHP
PHP初学者常见问题集合 修正版(21问答)
Mar 23 PHP
PHP运行时强制显示出错信息的代码
Apr 20 PHP
PHP源代码数组统计count分析
Aug 02 PHP
Smarty的配置与高级缓存技术分享
Jun 05 PHP
优化PHP代码技巧的小结
Jun 02 PHP
关于js与php互相传值的介绍
Jun 25 PHP
php switch语句多个值匹配同一代码块的实现
Mar 03 PHP
codeigniter显示所有脚本执行时间的方法
Mar 21 PHP
php实现转换ubb代码的方法
Jun 18 PHP
详谈phpAdmin修改密码后拒绝访问的问题
Apr 03 PHP
php7性能提升的原因详解
Oct 13 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 循环列出目录内容的函数代码
2010/05/26 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
PHP中的empty、isset、isnull的区别与使用实例
2019/03/22 PHP
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
JS中对数组元素进行增删改移的方法总结
2016/12/15 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
layui 图片上传+表单提交+ Spring MVC的实例
2019/09/21 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
Python实现的弹球小游戏示例
2017/08/01 Python
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
Selenium定时刷新网页的实现代码
2018/10/31 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
美国最佳在线航班预订网站:LookupFare
2019/03/26 全球购物
表扬通报怎么写
2015/01/16 职场文书
2015感人爱情寄语
2015/02/26 职场文书
严以律己学习心得体会
2016/01/13 职场文书
pandas中对文本类型数据的处理小结
2021/11/01 Python
Win11 S Mode版本泄露 正式上线后叫做Windows 11 SE
2021/11/21 数码科技