如何使用Perl在后续订单中获取所有可能的相邻项组合?

时间:2010-09-12 02:05:58

标签: perl combinations

例如,我有一个数组

my @arr = qw(0 1 2 3 4);

如何获得以下组合:

0
01
012
0123
01234
1
12
123
1234
2
23
234
3
34
4

如果有的话,这种组合(或排列)的名称是什么?

一如既往地谢谢!

3 个答案:

答案 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;