我正在尝试编写以下递归函数。问题是它永远不会结束,我无法理解为什么:
sub do_smth(@first, @second){
my @tmp_first = @first;
$tmp = shift(@tmp_first);
if (@tmp_first > 0){
do_smth(@tmp_first, @second);
}
my @tmp_second = @second;
$tmp = shift(@tmp_second);
if (@tmp_second > 0){
do_smth(@first, @tmp_second);
}
}
答案 0 :(得分:5)
此代码甚至无法编译。没有警告和严格,你会得到这些错误:
Type of arg 1 to shift must be array (not scalar dereference) at so.pl line 5, near "$tmp_first)"
Type of arg 1 to shift must be array (not scalar dereference) at so.pl line 10, near "$tmp_second)"
Execution aborted due to compilation errors.
并有警告和严格:
Illegal character in prototype for main::do_smth : @first,@second at so.pl line 4.
Global symbol "@first" requires explicit package name at so.pl line 5.
Global symbol "$tmp" requires explicit package name at so.pl line 6.
Global symbol "$tmp_first" requires explicit package name at so.pl line 6.
Type of arg 1 to shift must be array (not scalar dereference) at so.pl line 6, near "$tmp_first)"
Global symbol "@second" requires explicit package name at so.pl line 8.
Global symbol "@second" requires explicit package name at so.pl line 10.
Global symbol "$tmp" requires explicit package name at so.pl line 11.
Global symbol "$tmp_second" requires explicit package name at so.pl line 11.
Type of arg 1 to shift must be array (not scalar dereference) at so.pl line 11, near "$tmp_second)"
Global symbol "@first" requires explicit package name at so.pl line 13.
Execution aborted due to compilation errors.
我不知道你要做什么,但这里的代码是正确的语法:
use warnings;
use strict;
sub do_smth (\@\@); # predeclaration needed since the prototyped sub
# is called recursively
sub do_smth (\@\@) {
my ($first, $second) = @_;
my @tmp_first = @$first;
my $tmp = shift(@tmp_first);
if (@tmp_first > 0){
do_smth(@tmp_first, @$second);
}
my @tmp_second = @$second;
$tmp = shift(@tmp_second);
if (@tmp_second > 0){
do_smth(@$first, @tmp_second);
}
}
答案 1 :(得分:-1)
您正在转移(未定义的)标量 $ tmp_first和$ tmp_second。
没有再看了。