2012-04-03 28 views
0

ここで何が起こっているのかを視覚的に説明できますか?別の再帰的JavaScript関数

var stack = []; 

function countDown(int) { 
    stack.push(int); 
    if (int === 1) { 
     return 1; 
    } 
    return countDown(int - 1); 
} 

function multiplyEach() { 
    // Remove the last value of the stack 
    // and assign it to the variable int 
    int = stack.pop(); 
    x = stack.length; 
    // Base case 
    if (x === 0) { 
     return int; 
    } 
    // Recursive case 
    else { 
     stack[x - 1] = int * stack[x - 1]; 
     return multiplyEach(); 
    } 
} 

//呼び出し機能

countDown(7); 

//そして、私はそれはそれは、スタックを作成していますし、それらを掛け合わだ理解みかん

console.log(multiplyEach()); 

multiplyEach()が返す値をプリントアウト私はそれをすべて視覚化することはできません。そして

Stack[x-1] is getting me 
+0

この質問は不完全に見えます。終わった? – kojiro

+0

コードを理解し始めるには良いフォーマットです。 –

+0

私は理解しようとしています。フォーマットは完璧ではありません。それが私の全回答です。質問は完了しました – Sam

答えて

1

これは2つの部分からなるアルゴリズムです。

まずcountDown(n)1までnの値で配列stackを満たし、そうstack = [n, n-1, n-2, ..., 3, 2, 1]countDownの戻り値は使用されないため、returnステートメントは無視できます。重要な唯一のことは、説明した通りにstack配列を塗りつぶすことです。

次に、multiplyEachを繰り返し、スタックの最後の要素を取り、それを除去し、アレイ内の次の最後の要素でそれを乗算:すなわち

[n, n-1, n-2, ..., 6, 5, 4, 3, 2, 1] 
[n, n-1, n-2, ..., 6, 5, 4, 3, 2] 
[n, n-1, n-2, ..., 6, 5, 4, 6] 
[n, n-1, n-2, ..., 6, 5, 24] 
[n, n-1, n-2, ..., 6, 120] 
... 
[n!] 

、アルゴリズムは数の階乗を計算しますcountDownに付与されたn。関数は最終的にここスタックは、より詳細にint型1に

から番号が含まれている返すとき

0
int

が最後の配列要素の値に設定され、アレイから、xstackアレイの後pop長さに設定されているので、stack[x-1]であることが除去されています"新しい"配列の最後の要素を取得します。配列内にまだものがある場合は、intと新しい最後の要素(以前は2番目から最後まで)を掛けて配列の最後の要素として格納します。これは、配列が空になり、すべての数値が一緒に乗算されるまで、プロセスをもう一度呼び出します。

1
function countDown(int) { 
    stack.push(int); 
    if (int === 1) { 
    return 1; 
    } 
    return countDown(int - 1); 
} 

この関数は再帰的に、スタック変数にint型の値を追加して、この関数は

を働いている方法ですスタックへ

1-プッシュINT 2- INTが等しい場合は1つの戻り 3-さもなければ呼び出しカウントダウン(INT-1)

関数が再帰的に自分自身を呼び出すとtにINTを押し続けますintが1になるまでスタックします。最後にスタック変数には範囲[int, int-1, int-2, ... 1]が含まれています。次の行は、この配列は、次にmultipyEach関数によって

function multiplyEach() { 
    // Remove the last value of the stack and assign it to the variable int 
    int = stack.pop(); x = stack.length; 
    // Base case 
    if (x===0) { 
    return int; 
    } 
// Recursive case 
    else { 
    stack[x - 1] = int * stack[x - 1]; 
    return multiplyEach(); 
    } 
} 

使用されるこの関数は、配列の最後の要素を取り除き、機能カウントダウン

[int] 
[int, int-1] 
[int, int-1, int-2] 
[int, int-1, int-2, int-3] 
[int, int-1, int-2, int-3, int-4] 
.... 
[int, int-1, int-2, int-3, int-4,......1] 

の各反復後のスタックアレイの状態を示しそれを配列の前の数値と乗算し、その前の場所に格納します(stack[x - 1] = int * stack[x - 1];)。配列のサイズが0になるまで、この関数は自分自身を呼び出し続けます。intの内部の結果の数値はそれの階乗になります。以下はmultiplyEachの各繰り返しの後の配列の状態です。

[int, int-1, int-2, int-3, .... 4, 3, 2, 1] 
[int, int-1, int-2, int-3, .... 4, 3, 2] 
[int, int-1, int-2, int-3, .... 4, 6] 
[int, int-1, int-2, int-3, .... 24] 
. 
. 
[int!]