我正在尝试使用 NestedLoops 函数在 Perl 中构建一个排列程序。这是我的代码:
use strict;
use warnings;
use Algorithm::Loops qw(NestedLoops);
my @a = 'a'..'o';
my $length = 5;
my $start = 0;
my $depth = 2;
NestedLoops([
[0..$length],
( sub {
$start = 0 if $start == $depth;
$start++;
[$start * $length..$start * $length + $length - 1]
}) x $depth,
], \&permute,);
sub permute {
my @ind = @_;
foreach my $i (@ind) {
print $a[$i];
}
print "\n";
}
所以我有一个数组,其中包含字母“a”到“o”(大小为 15)。我将数组视为有 3 行,所以我对数组的想象是这样的:
abcde
fghij
klmno
然后每个循环对应于每一行......我想构建如下排列:
afk
afl
afm
afn
afo
agk // fails here... I end up getting agg
...
它适用于前 5 个值(最低 for 循环的整个运行),但随后第二次运行失败,因为最后一行的值$start
被重置为 0......这是一个问题,因为这会破坏一切。
所以我想知道的是,我怎样才能$start
根据级别保持持久的价值......所以我所要求的本质上是有常数。我的循环真的应该是这样的:
for my $a (0..5) { # 0 at this level and never change
for my $b (5..10) { # $start should be 5 at this level and never change
for my $c (10..15) { # $start should be 10 at this level and never change
permute($a, $b, $c);
}
}
}
现在,因为我将有可变长度的 for 循环,所以我无法对每个起始值进行硬编码,所以我正在寻找一种方法来最初创建这些起始值,然后在循环重置时保留它们。
我意识到这是一个令人困惑的问题,所以请提出问题,我将帮助澄清。