2013-03-25 109 views
1

我想在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 @[email protected]$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); 
    } 
} 
+2

总是使用'​​use strict;使用警告;' – ikegami 2013-03-25 09:16:50

+0

请不要回答与另一个问题的问题!但是,我总是使用严格的,变数和警告。 – Malo 2013-03-25 09:23:33

+6

那么为什么你没有提到你'不能使用字符串(“30762083”)作为SCALAR ref而“strict refs”在使用? – ikegami 2013-03-25 09:27:13

回答

2

我看不到任何东西相当如何进入阵列@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]); 
} 
} 
+0

@b是一个矩阵,并且在执行此操作的代码中有两个嵌套for循环:$ b [$ i] [$ j] = 1; (这有点抽象,但我不想发布所有的代码) – Malo 2013-03-25 09:31:56

+0

是的,但$ i $ j在每次递归调用中递减,所以我认为最好通过它们... – Malo 2013-03-25 09:39:56

+0

是的,有一个@b。这是回溯矩阵 – Malo 2013-03-25 09:41:00