免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: rubyish
打印 上一主题 下一主题

请大牛指导多数组内容排列 写成 generator [复制链接]

论坛徽章:
0
11 [报告]
发表于 2013-06-14 19:09 |只看该作者
顶~~~~~~~~~~~{:3_187:}

论坛徽章:
0
12 [报告]
发表于 2013-06-14 23:38 |只看该作者

  1. #!perl -w
  2.     my @A = ( [ 'A' .. 'B' ], [ 1 .. 2 ], [ 'a', 'b' ] );
  3.     print "{", join(", ", @$_), "}\n" for gnr(@A);

  4. sub gnr{
  5.     my $tail = pop @_;
  6.     return map { my $left = $_; map [@$left, $_], @$tail } gnr(@_) if (@_);
  7.     return map [$_], @$tail;
  8. }
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
13 [报告]
发表于 2013-06-15 11:28 |只看该作者
回复 12# mjus

很漂亮的代码,据我所知,貌似不是 generator ...

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
14 [报告]
发表于 2013-06-15 11:29 |只看该作者
回复 7# 104359176
据我所知,也貌似不是 generator ...

   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
15 [报告]
发表于 2013-06-15 11:49 |只看该作者
貌似写成 generator
只有 zhlong8版主 这个算法了
~

论坛徽章:
0
16 [报告]
发表于 2013-06-15 18:57 |只看该作者
用closure,应该可以写出generator吧

论坛徽章:
0
17 [报告]
发表于 2013-06-15 19:29 |只看该作者
用闭包做了个。不知道大家觉得如何。
  1. use warnings;
  2. use strict;

  3. sub Genterator
  4. {
  5.     my ( $raList ) = shift;
  6.     return 0 if not $raList or
  7.                 not @{ $raList };
  8.    
  9.     my ( $sStartIndex ) = 0;
  10.    
  11.     return sub {
  12.         return 0 if $sStartIndex > $#{ $raList->[0] };

  13.         my $sValue = join(" ", map { $_->[ $sStartIndex ] }  @{ $raList });
  14.         $sStartIndex++;
  15.         return $sValue;
  16.     }
  17. }


  18. sub Test
  19. {
  20.     my @A = ( [ 'A' ,"B", 'C',"D" ],
  21.               [ 1,2,3,4 ],
  22.               [ 'a', 'b', "c", "d" ] );
  23.     my $crGenterator =  Genterator( \@A );
  24.     while( my $sValue = $crGenterator->() ){
  25.         print "$sValue\n";
  26.     }
  27. }

  28. Test();
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
18 [报告]
发表于 2013-06-15 19:30 |只看该作者
回复 16# alpha14

这个 ?
  1. #!/usr/bin/perl
  2. use 5.018;
  3. my @A = ( [ 1 .. 3 ], [ 'A' .. 'C' ], [ 'a' .. 'b' ] );

  4. sub cross {
  5.     my ( $i, $E, $t, $A ) = ( -1, 1, 1, shift );
  6.     my @E = map { $E *= @$_; scalar @$_ } @$A;
  7.     my @M = reverse 1, map $t = $t * $E[ -$_ ], 1 .. $#E;
  8.     $E -= 1;
  9.     sub {
  10.         return if $i++ == $E;
  11.         [ map $A->[$_][ $i / $M[$_] % $E[$_] ], 0 .. $#E ];
  12.     };
  13. }
  14. my $gen = cross \@A;
  15. while ( my $r = $gen->() ) {
  16.     say "@$r";
  17. }
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
19 [报告]
发表于 2013-06-15 19:33 |只看该作者
alpha14 发表于 2013-06-15 15:29
用闭包做了个。不知道大家觉得如何。

    3Q 大牛~
仔细研究研究 ~

论坛徽章:
0
20 [报告]
发表于 2013-06-15 19:33 |只看该作者
回复 18# rubyish


好像是类似的思路。用闭包做迭代器吧。我想是这样的

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP