gpt4 book ai didi

Perl:使用算法::循环

转载 作者:行者123 更新时间:2023-12-05 00:34:58 24 4
gpt4 key购买 nike

我正在尝试使用 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 循环,所以我无法对每个起始值进行硬编码,所以我正在寻找一种方法来最初创建这些起始值,然后在循环重置时保留它们。

我意识到这是一个令人困惑的问题,所以请提出问题,我将帮助澄清。

最佳答案

你让这变得比它必须的更难。
部分问题在于 NestedLoops 的文档没有详细说明如何使用第一个参数中的子例程引用。

对于以下示例,假设这写在它们上方的某处。

use strict;
use warnings;
use Algorithm::Loops qw'NestedLoops';
真正最简单的调用方式 NestedLoops得到你想要的是这样的:
NestedLoops(
[
['a'..'e'],
['f'..'j'],
['k'..'o'],
],
\&permute
);

sub permute {
print @_, "\n";
}
如果你真的想要 NestedLoops 的参数要即时生成,我建议使用 part来自 List::MoreUtils .
use List::MoreUtils qw'part';

my @a = 'a'..'o';

my $length = 5;
my $index;

NestedLoops(
[
part {
$index++ / $length
} @a
],
\&permute
);

sub permute {
print @_, "\n";
}
如果出于某种原因您想调用 NestedLoops将索引放入数组中,使用 part 仍然很容易.
use List::MoreUtils qw'part';

my @a = 'a'..'o';

my $length = 5;

NestedLoops(
[
part {
$_ / $length
} 0..@a-1
],
\&permute
);

sub permute {
print map { $a[$_] } @_;
print "\n";
}
您真正遇到的主要问题是您提供给 NestedLoops 的两个子例程引用。正在修改相同的变量,并且它们都被多次调用。
解决此问题的最佳方法是依赖在调用子例程时为其提供的最后一个值。 (从实现来看,这似乎更接近它的用途。)
my @a = 'a'..'o';

my $length = 5;
my $depth = 3;

NestedLoops(
[
[0..$length-1],
(sub{
return unless @_;
my $last = pop;
my $part = int( $last / $length ) + 1; # current partition
my $start = $part * $length; # start of this partition
my $end = $start + $length;
[$start..$end-1] # list of variables in this partition
}) x ($depth-1)
],
\&permute
);

sub permute {
print map { $a[$_] } @_;
print "\n";
}

关于Perl:使用算法::循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10038251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com