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简单随机字符串生成方法示例

    php简单随机字符串生成方法示例

    这篇文章主要介绍了php简单随机字符串生成方法,结合实例形式分析了php生成随机字符串的相关技巧与注意事项,需要的朋友可以参考下
    2017-04-04
  • PHP附件下载中文名称乱码的解决方法

    PHP附件下载中文名称乱码的解决方法

    这篇文章主要介绍了PHP附件下载中文名称乱码的解决方法,分析了中文乱码形成的原因及对应的编码转换方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-12-12
  • php建立Ftp连接的方法

    php建立Ftp连接的方法

    这篇文章主要介绍了php建立Ftp连接的方法,实例分析了php操作FTP的相关函数及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • php下MYSQL limit的优化

    php下MYSQL limit的优化

    MYSQL的优化是非常重要的。其他最常用也最需要优化的就是limit。mysql的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。
    2008-01-01
  • php token使用与验证示例【测试可用】

    php token使用与验证示例【测试可用】

    这篇文章主要介绍了php token使用与验证方法,通过对form表单hidden提交字段的处理实现token验证功能,防止非法来源数据的访问,需要的朋友可以参考下
    2017-08-08
  • PHP获取表单所有复选框的值的方法

    PHP获取表单所有复选框的值的方法

    这篇文章主要介绍了PHP获取表单所有复选框的值的方法,是进行PHP程序设计表单操作中所必须掌握的常用技巧,需要的朋友可以参考下
    2014-08-08
  • php数据结构之顺序链表与链式线性表示例

    php数据结构之顺序链表与链式线性表示例

    这篇文章主要介绍了php数据结构之顺序链表与链式线性表,结合实例形式较为详细的分析了php实现顺序链表与链式线性表的各种常用操作技巧,需要的朋友可以参考下
    2018-01-01
  • php将图片保存入mysql数据库失败的解决方法

    php将图片保存入mysql数据库失败的解决方法

    这篇文章主要介绍了php将图片保存入mysql数据库失败的解决方法,详细分析了php将图片保存入数据库遇到的问题及对应的解决方法,并总结了相关的技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • php实现简单的MVC框架实例

    php实现简单的MVC框架实例

    这篇文章主要介绍了php实现简单的MVC框架,较为详细的分析了php实现MVC框架的相关实现技巧与注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • PHP通过GD库实现验证码功能示例

    PHP通过GD库实现验证码功能示例

    这篇文章主要介绍了PHP通过GD库实现验证码功能,结合实例形式分析了php验证码相关图片绘制、输出操作实现技巧,需要的朋友可以参考下
    2019-02-02

最新评论