免费注册 查看新帖 |

Chinaunix

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

又是个算法问题,帮忙看下 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2009-01-23 12:00 |只看该作者
改进版,用数字 或者 字母都可以啦  

#!/usr/bin/perl


use strict;
use warnings;

my $t1 = func(4, ('a', 'b', 'c'));
my $t2 = func(4, (1, 2, 3));

$_ = join '', map { map {@$_} @$_} ($t1);
print $_, "\n" for /\w{4}/g;

$_ = join '', map { map {@$_} @$_} ($t2);
print $_, "\n" for /\w{4}/g;
 
sub func {
    my $k = shift;
    my @data = @_;

    my $end = $data[-1];
    @data = map {$data[0]} 1..$k;
    
    my $t = [];
    while (1) {
        push @$t, [@data];
        my $t = -1;

        REDO:
        $data[$t] = chr((ord $data[$t])+1);
        if (ord $data[$t] > ord $end) {
            $t -= 1;
            last if abs $t > $k;
            goto REDO;
        }
        @data[$t .. -1] = map {$data[$t]} ($t .. -1);
    }
    return $t;
}

论坛徽章:
0
22 [报告]
发表于 2009-01-23 12:25 |只看该作者

回复 #20 ynchnluiti 的帖子

why?


I need get a return @ or $

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
23 [报告]
发表于 2009-01-23 12:32 |只看该作者
原帖由 yxm0513 于 2009-1-23 12:25 发表
why?
I need get a return @ or $

那句修改只是针对foo的参数。

论坛徽章:
0
24 [报告]
发表于 2009-01-23 12:39 |只看该作者

回复 #23 ynchnluiti 的帖子

没错


如果基于foo,获取return不怎么好搞

论坛徽章:
0
25 [报告]
发表于 2009-01-23 16:38 |只看该作者
#!/usr/bin/perl

use strict;

my $col_num = shift;
my @list = @ARGV;

exit 1 unless ($col_num > 0);

sub append {
    my $new_index = shift;
    my @index_list = @_;
   
    push(@index_list, $new_index);
   
    if (@index_list == $col_num) {
        print "@list[@index_list]\n";
        return;
    }
   
    append($_, @index_list) for ($new_index..$#list);

}

append($_) for (0..$#list);


#./test.pl 4  a b c
a a a a
a a a b
a a a c
a a b b
a a b c
a a c c
a b b b
a b b c
a b c c
a c c c
b b b b
b b b c
b b c c
b c c c
c c c c

[ 本帖最后由 iceberg77 于 2009-1-23 16:57 编辑 ]

论坛徽章:
0
26 [报告]
发表于 2009-01-24 00:31 |只看该作者
原帖由 yxm0513 于 2009-1-23 12:39 发表
没错


如果基于foo,获取return不怎么好搞



如果让函数返回结果集的话, 换一个递归式就行了, 其实差不多的.
sub genPermutations {
    my ($range, $len) = @_;
    
&nbsp;&nbsp;&nbsp;&nbsp;return ()      if $len  < 1;
&nbsp;&nbsp;&nbsp;&nbsp;return @$range if $len == 1;
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;my @subPermus = genPermutations($range, $len - 1);
&nbsp;&nbsp;&nbsp;&nbsp;my @newPermus = ();
&nbsp;&nbsp;&nbsp;&nbsp;for my $i (@$range) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for my $j (@subPermus) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push @newPermus, $i . $j;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;return @newPermus;
}

print join("\n", genPermutations([qw/a b/], 3));



收拾东西明天上飞机 :>
Happy Ox Year !
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP