2017-04-15 50 views
0

我正在嘗試這個簡單的代碼來計算5階乘因子。但是我得到「undefined」作爲結果。我知道其他方法,但是這有什麼問題?javascript factorial遞歸

<!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)該函數什麼也沒有返回(undefined) –

回答

0

如果你想從一個遞歸函數的結果,通過函數的所有代碼路徑必須返回的東西。您的代碼在num!=1的情況下不會返回任何內容。它應該返回自己調用的結果,例如(見***線):

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

你的功能,因爲它意味着funtion不自足使用全局變量,它是不是一個好主意;而不是真正的階乘函數,因爲你有效地利用兩個輸入(fact   —全球 和num,參數)

如果你想有一個真正的階乘,你並不需要一個全局變量,

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

當然,或者更簡潔:

從參數本身只是工作
function factorial(num) { 
    if (num < 0) { 
     throw new Error("num must not be negative"); 
    } 
    return num <= 1 ? 1 : num * factorial(num - 1); 
} 

(更多關於0!:https://en.wikipedia.org/wiki/Factorial

+0

通過「代碼路徑」,你指的是所有的塊? 謝謝,順便說一句!它解決了這個問題。 –

+0

@ShivamMishra:「代碼路徑」是執行可以通過函數移動的方式(如跟隨步行路徑)。例如,當'num'爲'1'時,我們在函數中使用一個路徑(使用原始函數中的'else'塊)。當num不是1時,我們在函數中走一條不同的路徑。 –

+0

明白了。我預計代碼將遵循我的直覺。另外,感謝提及不使用全局變量。 –

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

順便說一句,你的方法也許是工作,但真的不好style.May做到這一點:

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

或短:

calfact=num=>num==1?1:calfact(num-1)*num;