perl错误中的简单阶乘函数:在子例程外返回

Min*_*t.K 0 perl

我正在研究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语句仍然在子例程中.是什么导致错误?

ike*_*ami 8

间接方法表示法再次出现![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)
  1. 正如你在这个宏伟的例子中所看到的那样,它的存在导致许多错误被捕获.