免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8682 | 回复: 27
打印 上一主题 下一主题

多数组内容排列组合 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-26 10:34 |只看该作者 |倒序浏览
30可用积分
有多个数组,每个数组中取一个值,组合成一个字符串,生成所有的排列组合可能。

my @n = ( 1 .. 3 );
my @m = ( 1 .. 4);
my @f  = ( 1 .. 5);

生成
111
112
。。。
345

最佳答案

论坛徽章:
0
2 [报告]
发表于 2012-05-26 10:34 |只看该作者
本帖最后由 eperl 于 2012-05-27 09:43 编辑
  1. #!perl

  2. use strict;
  3. use warnings;
  4. use 5.010;
  5. use List::Util qw(shuffle);
  6. use Data::Dumper qw(Dumper);

  7. my $list = [
  8.     [1 .. 4],
  9.     [2 .. 5],
  10.     ['a','b','c'],
  11. ];

  12. # get the amount of permutation of all array
  13. my $permutation_amount = 1;
  14. for (values @{$list}) {
  15.     $permutation_amount *= scalar @{$_};;
  16. }

  17. my $ref_hash_permutation = {};
  18. # If amount of permutation is lost control, restrict the result
  19. for (1 .. 100) {
  20.     state $count = 0;
  21.     last if ($count == $permutation_amount);
  22.     my $str = random($list);
  23.     $count++ if (not exists $ref_hash_permutation->{$str});
  24.     $ref_hash_permutation->{$str}++;
  25. }

  26. say Dumper($ref_hash_permutation);

  27. sub random {
  28.     my ($list) = @_;
  29.     my $join_text;
  30.     for (@{$list}) {
  31.         $join_text .= shuffle @{$_};
  32.     }
  33.     return $join_text;
  34. }

复制代码

论坛徽章:
0
3 [报告]
发表于 2012-05-26 10:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
4 [报告]
发表于 2012-05-26 11:04 |只看该作者
要我就用递归了,但是这个是有模块的,但是模块叫什么名字我卡壳了

楼下知道

论坛徽章:
0
5 [报告]
发表于 2012-05-26 14:24 |只看该作者
回复 2# lxb456900

数组长度不同,个数也不一定是3个。



   

论坛徽章:
0
6 [报告]
发表于 2012-05-26 14:26 |只看该作者
回复 3# zhlong8

第一次听到楼下知道的说法。


   

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2012-05-26 14:56 |只看该作者
回复 5# Perlvim


    key word “Permutation” 在CPAN上找找,应该有现成的

论坛徽章:
0
8 [报告]
发表于 2012-05-27 06:44 |只看该作者
本帖最后由 Perlvim 于 2012-05-27 15:04 编辑
  1. #!perl

  2. use strict;
  3. use warnings;
  4. use 5.010;
  5. use Data::Dumper qw(Dumper);

  6. my $list = [
  7.     [1 .. 4],
  8.     [2 .. 5],
  9.     ['a','b','c'],
  10. ];

  11. my $str_list = create($list);
  12. say Dumper($str_list);

  13. sub create {
  14.     my ($list) = @_;
  15.     # 初始化序列
  16.     my $str_list = [ '' ];
  17.     foreach my $ref (@{$list}) {
  18.         $str_list = create_list($str_list, $ref);
  19.     }
  20.     return $str_list;
  21. }

  22. # 根据列表创建列表
  23. sub create_list {
  24.     my ($ref_str_list, $ref_array) = @_;
  25.     my @return_array;
  26.     foreach my $str (@{$ref_str_list}) {
  27.         foreach my $element (@{$ref_array}) {
  28.             push @return_array, "${str}$element";
  29.         }
  30.     }
  31.     return \@return_array;
  32. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2012-05-27 06:51 |只看该作者
这个算法的需求是要写测试集而产生的。
测试指定的一些函数,每个函数都有几个参数,每个参数都有一个范围。
函数较多,有几百个,参数也较多,最多的有7,8个,手动写测试集太辛苦了。于是想到了自动写。

实际的需求较复杂,每个参数都有一个名字,便于查询,还有默认值和是否必须提供,没有提供参数的默认值,返回值列表。

不过用程序写程序,是解决大量工作的捷径,关键是深入理解工作内容。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
10 [报告]
发表于 2012-05-27 12:08 |只看该作者
sub perm {
    my @result;
    while (@_) {
        my $current = pop @_;
        unless (@result) {
            push @result, map [$_], @$current;
            next;
        }
        my @data = @result;
        @result = ();
        for my $item (@$current) {
            push @result, map [$item, @$_], @data;
        }
    }
    return \@result;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP