php全排列递归算法代码

 更新时间:2012年10月09日 19:40:45   作者:   我要评论
php全排列递归算法代码,需要的朋友可以参考下
算法原理

如果用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中使用Memache作为进程锁的操作类分享

    PHP中使用Memache作为进程锁的操作类分享

    这篇文章主要介绍了PHP中使用Memache作为进程锁的操作类分享,本文直接给出类实现代码以及应用示例,需要的朋友可以参考下
    2015-03-03
  • Ajax+PHP实现的模拟进度条功能示例

    Ajax+PHP实现的模拟进度条功能示例

    这篇文章主要介绍了Ajax+PHP实现的模拟进度条功能,结合实例形式分析了php结合ajax动态读取文件实现进度条功能的相关操作技巧,需要的朋友可以参考下
    2019-02-02
  • 整理的一些实用WordPress后台MySQL操作命令

    整理的一些实用WordPress后台MySQL操作命令

    WordPress将其所有信息片段(包括文章、页面、评论、博客链接、插件设置等)存储在MySQL数据库中。 虽然WordPress用户可以通过网站后台编辑控制以上信息片段
    2013-01-01
  • 深入PHP FTP类的详解

    深入PHP FTP类的详解

    本篇文章是对PHP的FTP类进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP用户管理中常用接口调用实例及解析(含源码)

    PHP用户管理中常用接口调用实例及解析(含源码)

    本文主要介绍了PHP用户管理中常用接口调用实例及解析(含源码),具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • PHP JSON 数据解析代码

    PHP JSON 数据解析代码

    PHP解析JSON 数据代码,与大多数流行的 Web 服务如 twitter 、人人网通过开放 API 来提供数据一样,它总是能够知道如何解析 API 数据的各种传送格式,包括 JSON,XML 等等。
    2010-05-05
  • PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例

    PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例

    这篇文章主要介绍了PHP面向对象程序设计内置标准类,普通数据类型转为对象类型,结合实例形式分析了php面向对象程序设计中的内置标准类,普通数据类型概念、功能及对象类型转换相关操作技巧,需要的朋友可以参考下
    2019-06-06
  • 解决PHP超大文件下载,断点续传下载的方法详解

    解决PHP超大文件下载,断点续传下载的方法详解

    本篇文章是对PHP超大文件下载,断点续传下载的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • phpMyadmin 用户权限中英对照

    phpMyadmin 用户权限中英对照

    在登陆phpmyadmin时选择了“中文 – Chinese Simplified“,那么就有中文的管理界面了,虽然在phpmyadmin中显示的用户权限显示的还是英文的,但是鼠标放上去时,有中文的提示,这里把phpmyadmin v3.2.4中英文对照表附上
    2010-04-04
  • php简单统计在线人数的方法

    php简单统计在线人数的方法

    这篇文章主要介绍了php简单统计在线人数的方法,涉及php针对文本文件的读写与相关数学运算技巧,需要的朋友可以参考下
    2016-05-05

最新评论