请教一个全排列的算法
时间:2010-10-27
来源:互联网
本帖最后由 yybmsrs 于 2010-10-27 18:03 编辑
复制代码
输入i love you,输出如下:
复制代码
不明白的是n2pat和pat2perm算法的原理是什么呢?
- #!/usr/bin/perl -w
- # mjd_permute: permute each word of input
- use strict;
- sub factorial($); # forward reference to declare prototype
-
- while (<>) {
- my @data = split;
- my $num_permutations = factorial(scalar @data);
- for (my $i=0; $i < $num_permutations; $i++) {
- my @permutation = @data[n2perm($i, $#data)];
- print "@permutation\n";
- }
- }
-
- # Utility function: factorial with memoizing
- BEGIN {
- my @fact = (1);
- sub factorial($) {
- my $n = shift;
- return $fact[$n] if defined $fact[$n];
- $fact[$n] = $n * factorial($n - 1);
- }
- }
-
- # n2pat($N, $len) : produce the $N-th pattern of length $len
- sub n2pat {
- my $i = 1;
- my $N = shift;
- my $len = shift;
- my @pat;
- while ($i <= $len + 1) { # Should really be just while ($N) { ...
- push @pat, $N % $i;
- $N = int($N/$i);
- $i++;
- }
- print "---@pat---\n";
- return @pat;
- }
-
- # pat2perm(@pat) : turn pattern returned by n2pat( ) into
- # permutation of integers. XXX: splice is already O(N)
- sub pat2perm {
- my @pat = @_;
- my @source = (0 .. $#pat);
- my @perm;
- push @perm, splice(@source, (pop @pat), 1) while @pat;
- print "+++@perm+++\n";
- return @perm;
- }
-
- # n2perm($N, $len) : generate the Nth permutation of $len objects
- sub n2perm {
- pat2perm(n2pat(@_));
- }
- ---0 0 0---
- +++0 1 2+++
- i love you
- ---0 1 0---
- +++0 2 1+++
- i you love
- ---0 0 1---
- +++1 0 2+++
- love i you
- ---0 1 1---
- +++1 2 0+++
- love you i
- ---0 0 2---
- +++2 0 1+++
- you i love
- ---0 1 2---
- +++2 1 0+++
- you love i
作者: yybmsrs 发布时间: 2010-10-27
cpan有类似的模块·
作者: wfnh 发布时间: 2010-10-27
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28