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 相关文章推荐
一步一步学习PHP(6) 面向对象
Feb 16 PHP
phpMyadmin 用户权限中英对照
Apr 02 PHP
PHP stristr() 函数(不区分大小写的字符串查找)
Jun 03 PHP
php字符串分割函数explode的实例代码
Feb 07 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
PHP6连接SQLServer2005的三部曲
Apr 15 PHP
joomla实现注册用户添加新字段的方法
May 05 PHP
PHPCMS忘记后台密码的解决办法
Oct 30 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
Dec 07 PHP
thinkPHP模板引擎用法示例
Dec 08 PHP
PHP经典实用正则表达式小结
May 04 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 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
phpinfo 系统查看参数函数代码
2009/06/05 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
JavaScript计算字符串中每个字符出现次数的小例子
2013/07/02 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
jquery实现倒计时效果
2015/12/14 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
2018/08/25 Javascript
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
python获取交互式ssh shell的方法
2019/02/14 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
2020/02/27 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
计算机专业个人求职信范例
2013/09/23 职场文书
项目专员岗位职责
2013/12/04 职场文书
材料员岗位职责
2014/03/13 职场文书
副护士长竞聘演讲稿
2014/04/30 职场文书
民事授权委托书范文
2014/08/02 职场文书
酒店周年庆活动方案
2014/08/21 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
2015年学生会干事工作总结
2015/04/09 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
三方合作意向书范本
2015/05/09 职场文书
离婚起诉状范本
2015/05/19 职场文书
Jupyter notebook 输出部分显示不全的解决方案
2021/04/24 Python
Python中 range | np.arange | np.linspace三者的区别
2022/03/22 Python