Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 通过引用将参数传递给递归函数_Perl_Function_Recursion_Parameters_Matrix - Fatal编程技术网

Perl 通过引用将参数传递给递归函数

Perl 通过引用将参数传递给递归函数,perl,function,recursion,parameters,matrix,Perl,Function,Recursion,Parameters,Matrix,我试图用Perl做一个递归函数。因此,我必须使用引用传递参数。我试过各种方法,但都不管用 请注意,@b是一个矩阵 该错误重复出现,在LCS.pl行的数值等式(=)中使用未初始化值…。我不知道它是指$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

我试图用Perl做一个递归函数。因此,我必须使用引用传递参数。我试过各种方法,但都不管用

请注意,
@b
是一个矩阵

该错误重复出现,
在LCS.pl行的数值等式(=)中使用未初始化值…
。我不知道它是指
$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);
    }
}

我不太明白数组@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]);
}
}

始终使用
严格使用;使用警告请不要用其他问题回答问题!!然而,我总是使用strict、vars和warnings。那么为什么你没有提到你得到了
不能使用string(“30762083”)作为标量引用,而使用的是“strict refs”
?@b是一个矩阵,代码中有两个嵌套for cycle来执行此操作:$b[$I][$j]=1;(有点抽象,但我不想发布所有代码)是的,但是$I$j在每次递归调用中都会递减,所以我认为最好传递它们……是的,有一个@b。这就是回溯matrix@Vorsprung,
@$b
是只读AoA输入。不需要复制它(如果你做了,
[@$b]
就不够了)…意思是
printLCS($i-1,$j-1,$b)很好。