2017-03-06 6 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); 
    } 
} 

私にエラーを与えます。エラーの原因は何ですか?

+7

サブファクトリ{...}でサブルーチンを定義します。 'sub'キーワードがなければ、それはサブルーチンではなく、別のものです – zdim

+0

' factorial();のメイン関数を呼び出す – ssr1012

+0

'$ ARGV [0]'はプログラムの最初のコマンドライン引数です。あなたのサブルーチン( '$ _ [0]'にあります)の最初のパラメータです。 –

答えて

8

間接的な方法の表記が再び襲います! [1]

factorial { ... } 

は、問題は、あなたがサブの宣言の開始時にsubキーワードが欠落していることである

(do { ... })->factorial 

として解析されています。

また
sub factorial { ... } 

factorial { ... } 

を交換し、サブルーチンの引数は、@_、ない@ARGVで提供されているので、

my $n = $ARGV[0]; 

する必要があります3210

最後に、再帰的アプローチを使用することは非常に非効率的です。サブコールはかなり高価です。以下は、はるかに高速です:

sub factorial { 
    my $n = shift; 
    my $acc = 1; 
    $acc *= $_ for 2..$n; 
    return $acc; 
} 

  1. それは存在はあなたがthis magnificent exampleで見ることができるように、彼らは、あるべき時に引っ掛かり、多くのエラーが発生します。
関連する問題