【问题标题】:simple factorial function in perl error: return outside a subroutineperl错误中的简单阶乘函数:在子例程之外返回
【发布时间】:2017-07-25 22:06:20
【问题描述】:

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

【问题讨论】:

  • 你通过sub factorial { ... }定义了一个子程序。没有sub 关键字,它是别的东西,而不是子程序
  • 调用主函数factorial();
  • 另请注意,$ARGV[0] 是程序的第一个命令行参数,而不是子程序的第一个参数(在 $_[0] 中)。

标签: perl


【解决方案1】:

间接方法符号再次来袭![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;
}

  1. 它的存在导致许多错误在应有的时候被捕获,正如您在 this magnificent example 中看到的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    相关资源
    最近更新 更多