Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl中的简单阶乘函数错误:在子例程外部返回_Perl - Fatal编程技术网

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] 正在被解析为

我正在用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]

正在被解析为

(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;
    }