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基础知识:类与对象(2) 自动加载对象
Dec 13 PHP
PHP+FLASH实现上传文件进度条相关文件 下载
Jul 21 PHP
实用函数2
Nov 08 PHP
php相当简单的分页类
Oct 02 PHP
PHP定时更新程序设计思路分享
Jun 10 PHP
php画图实例
Nov 05 PHP
PHP输出日历表代码实例
Mar 27 PHP
浅谈PHP面向对象之访问者模式+组合模式
May 22 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 20 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
May 11 PHP
如何优雅的使用 laravel 的 validator验证方法
Nov 11 PHP
PHP的mysqli_stmt_init()函数讲解
Jan 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
自定义PHP分页函数
2006/10/09 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
基于Laravel 5.2 regex验证的正确写法
2019/09/29 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
jQuery 阴影插件代码分享
2012/01/09 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
JavaScript实现简单的数字倒计时
2015/05/15 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
Javascript es7中比较实用的两个方法示例
2017/07/21 Javascript
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
BootStrap自定义popover,点击区域隐藏功能的实现
2018/01/23 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
详解基于node.js的脚手架工具开发经历
2019/01/28 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
Python判断操作系统类型代码分享
2014/11/22 Python
Python内建数据结构详解
2016/02/03 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
Pycharm 操作Django Model的简单运用方法
2018/05/23 Python
Python二进制串转换为通用字符串的方法
2018/07/23 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
优秀老师事迹材料
2014/02/05 职场文书
医师定期考核实施方案
2014/05/07 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
收银员岗位职责范本
2015/04/07 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
跳高加油稿
2015/07/21 职场文书
MySQL数据库事务的四大特性
2022/04/20 MySQL
PostgreSQL常用字符串分割函数整理汇总
2022/07/07 PostgreSQL