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 @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) に何かが入る方法はよくわかりませんが、これはあなたが望むものに近いと思います...と思います。行の 1 つの短いコメント....

printLCS($i-1,$j-1,[@$b]);

[@$b] はもっと説明が必要です。$b は配列参照です。配列を参照する単一のスカラー @$b は参照を実際の配列に変換します。したがって、@x=@$b と言ってから、$x[1] のような配列構文を使用して、コピーされた $b 参照配列内の要素を取得できます。角括弧は、角括弧内のもののコピーを作成する配列コンストラクターです。私がこれを行った理由は、各フレームが分離されるように、再帰で渡された配列の一意のコピーが必要であると想定しているためです。この種のデータ構造の適切な扱いについては、 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 に答える