2017-03-06 36 views
0

我正在使用Perl中的階乘函數。 下面的代碼給我的錯誤Can't return outside a subroutine.perl錯誤中的簡單階乘函數:在子例程外返回

factorial { 
    my $n = $ARGV[0]; 
    if($n <= 1){ 
     return 1; # ----- Error Here ----- 
    } 
    else { 
     return $n * factorial($n - 1); 
    } 
} 

我相信我的if語句仍是子程序內。什麼導致了錯誤?

+7

你可以用'sub factorial {...}'定義一個子程序。如果沒有'sub'關鍵字,它就是其他的東西,而不是子程序 – zdim

+0

調用main函數'factorial();' – ssr1012

+0

另外請注意,'$ ARGV [0]'是你的程序的第一個命令行參數,而不是第一個參數給你的子程序(在'$ _ [0]'中)。 –

回答

8

間接方法符號再次觸擊! [1]

factorial { ... } 

被解析爲

(do { ... })->factorial 

的問題是,你缺少在子的聲明開始的sub關鍵字。與

sub factorial { ... } 

同時更換

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看到許多錯誤。