Perl 通过引用将参数传递给递归函数
我试图用Perl做一个递归函数。因此,我必须使用引用传递参数。我试过各种方法,但都不管用 请注意,Perl 通过引用将参数传递给递归函数,perl,function,recursion,parameters,matrix,Perl,Function,Recursion,Parameters,Matrix,我试图用Perl做一个递归函数。因此,我必须使用引用传递参数。我试过各种方法,但都不管用 请注意,@b是一个矩阵 该错误重复出现,在LCS.pl行的数值等式(=)中使用未初始化值…。我不知道它是指$I还是$j或@b 代码如下: $#ARGV+1 == 2 || die "USAGE: [PROGRAM] [v] [w]\n"; my $one = shift; my $two = shift; my @v = split("",$one); my @w = split("",$two); my
@b
是一个矩阵
该错误重复出现,在LCS.pl行的数值等式(=)中使用未初始化值…
。我不知道它是指$I
还是$j
或@b
代码如下:
$#ARGV+1 == 2 || die "USAGE: [PROGRAM] [v] [w]\n";
my $one = shift;
my $two = shift;
my @v = split("",$one);
my @w = split("",$two);
my $n = $#v+2;
my $m = $#w+2;
my @b;
#### DO VARIOUS OPERATIONS...
&printLCS(\$n,\$m,\@b);
##################################################
sub printLCS
{
my $i = shift;
my $j = shift;
my $arrayref = shift;
my @b=@$arrayref;
if( ($$i == 0) || ($$j == 0) ) {
return;
}
if($b[$$i][$$j] == 3) { #diag
&printLCS(\$i-1,\$j-1,\@b);
print $v[$$i];
}
elsif($b[$$i][$$j] == 1) { #up
&printLCS(\$i-1,\$j,\@b);
}
else { # left
&printLCS(\$i,\$j-1,\@b);
}
}
我不太明白数组@b(或者我重做过的$b)是如何进入的,但我认为这更接近您想要的。对其中一行的简短评论
printLCS($i-1,$j-1,[@$b]);
[@$b]需要更多的解释$b是一个数组ref,是指数组的单个标量
@$b将引用转换为实际数组。因此,您可以说@x=@$b,然后使用像$x[1]这样的数组语法来获取复制的$b ref'd数组中的元素。方括号是一个数组构造函数,用于复制方括号中的内容。我这样做的原因是,我假设您希望在递归中传递数组的唯一副本,以便每个帧是分开的。请参见perldoc-perldsc,了解对此类数据结构的良好处理
$#ARGV+1 == 2 || die "USAGE: [PROGRAM] [v] [w]\n";
my $one = shift;
my $two = shift;
my @v = split("",$one);
my @w = split("",$two);
my $n = $#v+2;
my $m = $#w+2;
my @b;
#### DO VARIOUS OPERATIONS...
printLCS($n,$m,\@b);
##################################################
sub printLCS
{
my $i = shift;
my $j = shift;
my $arrayref = shift;
my $b=$arrayref;
if(($i==0)||($j ==0))
{
return;
}
if($b->[$i]->[$j] == 3) #diag
{
printLCS($i-1,$j-1,[@$b]);
print $v[$i];
}
elsif($b->[$i]->[$j] == 1) #up
{
printLCS($i-1,$j,[@$b]);
}
else # left
{
printLCS($i,$j-1,[@$b]);
}
}
始终使用
严格使用;使用警告代码>请不要用其他问题回答问题!!然而,我总是使用strict、vars和warnings。那么为什么你没有提到你得到了不能使用string(“30762083”)作为标量引用,而使用的是“strict refs”
?@b是一个矩阵,代码中有两个嵌套for cycle来执行此操作:$b[$I][$j]=1;(有点抽象,但我不想发布所有代码)是的,但是$I$j在每次递归调用中都会递减,所以我认为最好传递它们……是的,有一个@b。这就是回溯matrix@Vorsprung,@$b
是只读AoA输入。不需要复制它(如果你做了,[@$b]
就不够了)…意思是printLCS($i-1,$j-1,$b)代码>很好。