通过ref将参数传递给递归函数

时间:2013-03-25 09:07:58

标签: perl function recursion parameters matrix

我正在尝试在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);
    }
}

1 个答案:

答案 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]);
}
}