2013-03-25 119 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