例如,我有一个数组
my @arr = qw(0 1 2 3 4);
如何获得以下组合:
0
01
012
0123
01234
1
12
123
1234
2
23
234
3
34
4
如果有的话,这种组合(或排列)的名称是什么?
一如既往地谢谢!
答案 0 :(得分:7)
我个人发现gbacon使用的循环“C风格”经常使代码不必要地复杂化。而且通常可以用更容易理解的“范围式”循环替换它。
#!/usr/bin/perl
use strict;
use warnings;
my @arr = qw(0 1 2 3 4);
my @result;
for my $i (0 .. $#arr) {
for my $j ($i .. $#arr) {
push @result => [ @arr[$i .. $j] ];
}
}
print @$_, "\n" for @result;
答案 1 :(得分:6)
使用数组切片:
#! /usr/bin/perl
use warnings;
use strict;
my @arr = qw(0 1 2 3 4);
my @result;
for (my $i = 0; $i < @arr; $i++) {
for (my $j = $i; $j < @arr; $j++) {
push @result => [ @arr[$i .. $j] ];
}
}
print @$_, "\n" for @result;
输出:
0 01 012 0123 01234 1 12 123 1234 2 23 234 3 34 4
答案 2 :(得分:1)
这是一种将问题分解为更多离散组件的方法:
use strict;
use warnings;
sub consec_subseq_leading {
# (1, 2, 3) ==> ( [1], [1, 2], [1, 2, 3] )
return map [ @_[0 .. $_] ], 0 .. $#_;
}
sub consec_subseq {
# (1, 2, 3) ==> ( F(1, 2, 3), F(2, 3), F(3) )
# where F = consec_subseq_leading
my $j = $#_;
return map consec_subseq_leading( @_[$_ .. $j] ), 0 .. $j;
}
my @cs = consec_subseq(0 .. 4);
print "@$_\n" for @cs;