我正在研究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);
}
}
Run Code Online (Sandbox Code Playgroud)
我相信我的if语句仍然在子例程中.是什么导致错误?
间接方法表示法再次出现![1]
factorial { ... }
Run Code Online (Sandbox Code Playgroud)
被解析为
(do { ... })->factorial
Run Code Online (Sandbox Code Playgroud)
问题是您sub在子声明的开头缺少关键字.更换
factorial { ... }
Run Code Online (Sandbox Code Playgroud)
同
sub factorial { ... }
Run Code Online (Sandbox Code Playgroud)
此外,在提供子程序参数@_,不是@ARGV,所以
my $n = $ARGV[0];
Run Code Online (Sandbox Code Playgroud)
应该
my $n = $_[0];
-or-
my $n = shift;
-or-
my ($n) = @_;
Run Code Online (Sandbox Code Playgroud)
最后,使用递归方法效率非常低.子呼叫相当昂贵.以下更快:
sub factorial {
my $n = shift;
my $acc = 1;
$acc *= $_ for 2..$n;
return $acc;
}
Run Code Online (Sandbox Code Playgroud)