2017-04-15 10 views
0

私は5の階乗を計算するためにこの単純なコードを試しています。しかし、結果として「未定義」になっています。私は他の方法を認識していますが、これに何が間違っていますか?再帰を伴うjavascript階乗

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

(num!= 1)関数が何も返さない(未定義) –

答えて

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

あなたの関数は、それが目的球が自己完結型ではありません手段として素晴らしいアイデアではありませんグローバル変数を、使用しています。あなたは本当の階乗をしたい場合は、あなたが効果的に二つの入力(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

"コードパス"とは、すべてのブロックを意味しますか? ありがとう、btw!それは事を解決した。 –

+0

@ ShivamMishra:「コードパス」は、関数が(ウォーキングパスをたどるように)移動する方法です。例えば、 'num'が' 1'のとき、関数を通るパス(元の関数の 'else'ブロックを使用するパス)を1つ歩きます。 '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; 
関連する問題