我正在研究Perl中的阶乘函数。
下面的代码给出了错误Can't return outside a subroutine.
factorial {
my $n = $ARGV[0];
if( $n <= 1 ){
return 1; # ----- Error Here -----
}
else {
return $n * factorial($n - 1);
}
}
我相信我的if语句仍然在子例程中。导致错误的原因是什么?
答案 0 :(得分:8)
间接方法符号再次出现! [1]
factorial { ... }
正在被解析为
(do { ... })->factorial
问题是您在子声明的开头缺少sub
关键字。取代
factorial { ... }
带
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;
}