2017-02-16 11 views
0

を停止する方法を再帰的な階乗関数を知っているん:私は再帰を実践するために、再帰的階乗関数を記述しようとすると、この思い付いたとき

function test(num){ 
    return (num * test(num - 1)) 
} 

私はそれを実行するたびにしかし、それは永遠にループし、レンジエラー:最大コールスタックサイズを超えました。

しかし、私は

function factorial(num) { 
    if (num < 0) { 
     return -1; 
    } else if (num === 0) { 
     return 1; 
    } else { 
     return (num * factorial(num - 1)); 
    } 
} 

、それは例外を処理するために書く場合、それは完璧に動作します。

2件

  1. なぜ最初のものは機能しませんか?

  2. どのようにして実行を停止するかを知っていますか? numが実際に変更された場合、それは最終的に0にヒットすることにより、-1たびに値だとそれがあれば、他の引き金と1を返しますが、あなたは階乗実行する場合(3)それは6

+0

最初のものは常に自分自身を呼び出す( 'test()') - 停止する条件はありません。 2番目は 'num === 0'のときに止まります。 – bejado

+0

2番目の文は 'if()'文を持ち、それが基底の場合に再帰しません。これは再帰の本質です。 – Barmar

+0

2を返すにもかかわらず、1を返しても、その結果は呼び出された関数(num = 1)でnumを掛けてから呼び出しスタックを2回上回るので、 – samgak

答えて

2
  1. を返さないはずです

    再帰にはベースケース - 関数が停止したときの条件が必要です。

  2. あなたはnumからnum-1に下るというように0まで、関数は基本ケース満たし、その時点でされています。再帰が戻って巻き戻し、および1 * num-(num-1)を乗算num == 0をし、この時点から1を返します。.. 。num

また、階乗は-1を返すに多くのポイントを唯一の非負整数のために定義され、そうされていません。別のこと:基本ケースは実際にはnum == 1でなければなりません。

num ==1の場合には1を掛けた後、の場合は1を再度掛けます。編集factorial(0).

の間違った階乗を返し :階乗(0)だから、1ですが、あなたは確かに 1を返すことが正しかったが、私はまだコーナーケースとしてそれを置くでしょう。その余分なステップが0になるまで待つ必要はありません。

function factorial(n){ 
    // Handle the corner cases: you might as well just throw an error 
    if (n < 0) return undefined; 
    if (n == 0) return 1; 

    // Base case 
    if (n == 1) return 1; 

    // Iterative step 
    // (If the function got to this point, it means, that n > 1) 
    return n * factorial(n - 1); 

    // In order to return the expression on the right side of "return", 
    // You need to calculate the `factorial(n - 1)` 
    // When you try calculating it, you will see, that now you need to 
    //  find out the `factorial(n - 1)` again, but this time the 
    //  `n` is actually `(n - 1)` :) 
    // So this way, you are digging into the call stack. 
    // At some point you reach the 1. WHICH RETURNS 1. WOOHOO. 
    // No need to calculate the `factorial` anymore. 
    // Now all the expressions you couldn't evaluate, get evaluated 1 by 1 
} 
+0

再帰のプロセスの良い説明。ありがとう。私の頭を包み込むのはまだ難しいですが、これは私が見てきた最良の説明です。それは今や一種の意味があります。ハハ。私はちょうど彼らが感覚を作り始めるまでそれらをもっと使う必要があります – nwimmer123

+0

@ nwimmer123私は説明を少し更新しました、私はそれがより明確であることを望みます。 – hlfrmn

関連する問題