1

我正在尝试在 Perl 中执行递归函数。所以,我必须使用引用传递参数。我已经尝试了各种方式,但它不起作用。

请注意,这@b是一个矩阵。

错误重复出现并且是Use of uninitialized value in numeric eq (==) at LCS.pl line ...。我不知道它是指$ior$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);
    }
}
4

1 回答 1

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]);
}
}
于 2013-03-25T09:27:29.180 回答