2017-03-06 3 views
0

Ich arbeite an einer Fakultät Funktion in Perl. Der folgende Code gibt mir den Fehler Can't return outside a subroutine.einfache faktorielle Funktion in Perl Fehler: Rückgabe außerhalb einer Subroutine

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

ich glaube, wenn Aussage immer noch innerhalb des Unterprogramms ist. Was verursacht den Fehler?

+7

Sie definieren ein Unterprogramm von 'Unter faktorielles {...}'. Ohne das 'sub' Schlüsselwort ist es etwas anderes, und kein Unterprogramm – zdim

+0

Anruffunktion im Haupt' faktorielles(); ' – ssr1012

+0

Beachten Sie auch, dass' $ ARGV [0] 'ist das erste Befehlszeilenargument zu Ihrem Programm, nicht die erster Parameter zu Ihrer Subroutine (das ist in $ _ [0] '). –

Antwort

8

Indirekte wieder Streiks Methode Schreibweise! [1]

factorial { ... } 

wird als

(do { ... })->factorial 

analysiert Das Problem ist, dass Sie das sub Schlüsselwort zu Beginn der Erklärung des Unter fehlen. Ersetzen

factorial { ... } 

mit

sub factorial { ... } 

Auch Subroutine Argumente werden in @_ vorgesehen ist, nicht @ARGV, so

my $n = $ARGV[0]; 

sollte

my $n = $_[0]; 
    -or- 
my $n = shift; 
    -or- 
my ($n) = @_; 

schließlich eine rekursive Ansatz ist sehr ineffizient. Unter Anrufe sind ziemlich teuer. Das Folgende ist viel schneller:

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

  1. Es ist Existenz verursacht viele Fehler aus gefangen werden, wenn sie sein sollten, wie Sie in this magnificent example sehen können.
Verwandte Themen