我正在尝试在Perl中执行递归函数。所以,我必须使用引用传递参数。我已经尝试过各种方式,但它不起作用。
请注意,@b
是一个矩阵。
错误重复,为Use of uninitialized value in numeric eq (==) at LCS.pl line ...
。我不知道它是指$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);
}
}
答案 0 :(得分:2)
我没有看到有什么东西进入数组@b(或者是因为我重做了它的$ b)但是这更接近你想要的......我想。关于其中一条线的简短评论......
printLCS($i-1,$j-1,[@$b]);
[@ $ b]需要更多解释。 $ b是一个数组引用,一个引用数组的标量 @ $ 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]);
}
}