2017-04-15 3 views
0

Ich versuche diesen einfachen Code zu faktoriellen von 5 berechnen. Aber ich bekomme "undefiniert" als Ergebnis. Ich kenne andere Methoden, aber was ist daran falsch?Javascript Fakultät mit Rekursion

<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title> Learning </title> 
<head> 
<body> 
<h2> Welcome<h2> 
<p id="demo"></p> 
<script> 
var fact=5; 
function calfact(num) 
{ 
if(num!=1) 
    { 
    fact=fact*(num-1); 
    num=num-1; 
    calfact(num); 
    } 
else 
    { 
    return fact; 
    } 
} 

document.getElementById("demo").innerHTML=calfact(5); 
</script> 
</body> 
</html>   
+2

if (num! = 1) gibt die Funktion nichts zurück (undefiniert) –

Antwort

0

Wenn Sie ein Ergebnis aus einer rekursiven Funktion wollen, alle Codepfade durch die Funktion muss etwas zurückgeben. Ihr Code gibt im Fall num!=1 nichts zurück. Es sollte das Ergebnis des Anrufs selbst zurückgeben, z. (Siehe *** Linie):

var fact=5; 
function calfact(num) 
{ 
if(num!=1) 
    { 
    fact=fact*(num-1); 
    num=num-1; 
    return calfact(num); // *** 
    } 
else 
    { 
    return fact; 
    } 
} 

Ihre Funktion eine globale Variable verwendet, die keine gute Idee ist, da es bedeutet, dass die funtion ist nicht in sich geschlossen; und nicht um eine echte Fakultäts-Funktion, da Sie effektiv verwenden zwei Eingänge (fact   — die globalen   und num, das Argument)

Wenn Sie ein echtes faktorielles wollen, müssen Sie nicht eine globale Variable benötigen, nur Arbeit aus dem Argumente selbst:

function factorial(num) { 
 
    if (num < 0) { 
 
     throw new Error("num must not be negative"); 
 
    } 
 
    if (num <= 1) { 
 
     // Both 1! and 0! are defined as 1 
 
     return 1; 
 
    } 
 
    return num * factorial(num - 1); 
 
} 
 
console.log(factorial(5)); // 120

Oder natürlich, kompakten:

function factorial(num) { 
    if (num < 0) { 
     throw new Error("num must not be negative"); 
    } 
    return num <= 1 ? 1 : num * factorial(num - 1); 
} 

(Mehr über 0 !: https://en.wikipedia.org/wiki/Factorial)

+0

Mit "code paths" meinen Sie alle Blöcke? Danke, übrigens! Es hat das Ding gelöst. –

+0

@ShivamMishra: Ein "Code-Pfad" ist eine Art und Weise, wie sich eine Ausführung durch eine Funktion bewegen kann (wie einem Laufpfad folgend). Wenn also zum Beispiel "num" "1" ist, gehen wir einen Pfad durch die Funktion (diejenige, die den "else" -Block in Ihrer ursprünglichen Funktion verwendet). Wenn 'num' nicht 1 ist, gehen wir einen anderen Pfad durch die Funktion. –

+0

Ich habe es erwartet. Ich habe erwartet, dass der Code meiner Intuition folgt. Danke, dass Sie die globale Variable nicht verwenden. –

1
var fact=5; 
function calfact(num){ 
    if(num!=1){ 
     fact=fact*(num-1); 
     num=num-1; 
     return calfact(num);//the missing thing 
    }else{ 
     return fact;//why fact? i think it should be 1 
    } 
} 

By the way, Ihr Ansatz vielleicht funktioniert, aber wirklich schlecht style.May dies tun:

function calfact(num){ 
    if(num!=1){ 
    return calfact(num-1)*num; 
    }else{ 
    return 1; 
} 
} 

Oder kurz: