perl中的简单阶乘函数错误:在子例程外部返回
我正在用Perl编写一个阶乘函数。 下面的代码告诉我错误perl中的简单阶乘函数错误:在子例程外部返回,perl,Perl,我正在用Perl编写一个阶乘函数。 下面的代码告诉我错误无法在子例程之外返回。 factorial { my $n = $ARGV[0]; if( $n <= 1 ){ return 1; # ----- Error Here ----- } else { return $n * factorial($n - 1); } } 阶乘{ my$n=$ARGV[0]; 如果($n间接法符号再次出现![1] 正在被解析为
无法在子例程之外返回。
factorial {
my $n = $ARGV[0];
if( $n <= 1 ){
return 1; # ----- Error Here -----
}
else {
return $n * factorial($n - 1);
}
}
阶乘{
my$n=$ARGV[0];
如果($n间接法符号再次出现![1]
正在被解析为
(do { ... })->factorial
问题是您缺少sub声明开头的sub
关键字。替换
factorial { ... }
与
此外,子程序参数在@
中提供,而不是@ARGV
中提供,因此
my $n = $ARGV[0];
应该是
my $n = $_[0];
-or-
my $n = shift;
-or-
my ($n) = @_;
最后,使用递归方法是非常低效的。子调用相当昂贵。以下方法要快得多:
sub factorial {
my $n = shift;
my $acc = 1;
$acc *= $_ for 2..$n;
return $acc;
}
它的存在会导致许多错误,因为它们本该被发现,正如您在中所看到的
您可以通过sub-factorial{…}
定义子例程。如果没有sub
关键字,它是另一个东西,而不是主factorial();
中的子例程调用函数。另外请注意,$ARGV[0]
是程序的第一个命令行参数,而不是子例程的第一个参数(在$\u0中)
)。
my $n = $_[0];
-or-
my $n = shift;
-or-
my ($n) = @_;
sub factorial {
my $n = shift;
my $acc = 1;
$acc *= $_ for 2..$n;
return $acc;
}