2017-02-12 14 views
0

私はこのコードがどのように配列の組み合わせを作成するのかを理解しようとしていますが、再帰で同じ関数を2回目の行に渡す方法についてはわかりません。私は再帰の理解に取り組んできましたが、2回目に再び関数を渡す方法がわかりません。これについての説明があれば助けになります。再帰で2つの関数を使用するJavascript

function string_recurse(active, rest) { 
    if (rest.length == 0) { 
     console.log(active); 
    } else { 
     string_recurse(active + rest.charAt(0), rest.substring(1, rest.length)); 
     string_recurse(active, rest.substring(1, rest.length)); 
    } 
} 
string_recurse("", "abc"); 
+0

正確に知りたいことは本当に明確ではありません。私たちはあなたがその機能をどこに持っているのか、それがなぜ機能するのかを知りませんので、どんな答えを期待していますか?この関数は再帰的に呼び出しますが、呼び出しで2回呼び出されますが、理由は元の作者だけがあなたに伝えることができます。 – Connum

+0

[再帰関数呼び出しのない順列](http://stackoverflow.com/questions/34013675/permutations-without-recursive-function-call)を参照してください。 – guest271314

答えて

0

それは再帰を終了するたびに、それは、呼び出し元に戻ります(それはif (rest.length == 0)に達します)。呼び出し元は、呼び出し元に戻るのではなく(通常通り)、再帰を再度呼び出します。

ここで、それが優れている場合は、物事

function string_recurse(active, rest, i) { 
 
    if (rest.length == 0) { 
 
     console.log(active); 
 
    } else { 
 
     console.log('Calling 1st recursion at depth', i); 
 
     string_recurse(active + rest.charAt(0), rest.substring(1, rest.length), i + 1); 
 
     console.log('Ended first recursion, calling second one at depth', i); 
 
     string_recurse(active, rest.substring(1, rest.length), i + 1); 
 
     console.log('Ended second recursion at depth', i); 
 
    } 
 
} 
 
string_recurse("", "abc", 0);

か、を説明することができconsole.logの束にしてシーケンスを説明しようとスキーマを例に見てみましょう呼び出し:

f("", "abc") 
| 
| 
--- f("a", "bc") 
    | 
    | 
    --- f("ab", "c") 
     | 
     | 
     --- f("abc", "") -> console.log() 
     --- f("ab", "") -> console.log() 
    | 
    | 
    --- f("a", "c") 
     | 
     | 
     --- f("ac", "") -> console.log() 
     --- f("a", "") -> console.log() 
| 
| 
--- f("", "bc") 
    | 
    | 
    --- f("b", "c") 
     | 
     | 
     --- f("bc", "") -> console.log() 
     --- f("b", "") -> console.log() 
    | 
    | 
    --- f("c", "") -> console.log() 

あなたは開始から終了までの呼び出しの順序を確認することができ、あなたはすべての機能を見ることができますまたは2人の子供を持っているか、active

0

ランの値このスニペットを印刷し、それはあなたがそれを視覚化に役立つかもしれない:

var h = 0; 
var i = 0; 
var j = 0; 

function string_recurse(active, rest, x) { 
    h += x==='a' ? 1 : 0; 
    i += x==='b' ? 1 : 0; 
    j += x==='c' ? 1 : 0; 
    console.log(`${x} (a${h} b${i} c${j}) active:${active}`); 
    if (rest.length == 0) { 
     //console.log(active); 
    } else { 
     string_recurse(active + rest.charAt(0), rest.substring(1, rest.length), "b"); 
     string_recurse(active, rest.substring(1, rest.length), "c"); 
    } 
} 
string_recurse("", "abc", "a"); 

コンソール:

(A1、B0 C0)アクティブ:
B(アクティブA1 B1のC0):
B(A1 B2 C0)活性:AB
B(A1 B3 C0)活性:ABC
C(A1 B3 C1)活性:AB
C(A1 B3 C2)活性:
B(A1、B4、C2)活性:(A1、B4、C3)アクティブAC
C:
C(A1 B4 C4)活性:
B(A1 B5のC4)活性:BC
C(A1、B6、C5)活性:
B(A1 B7 C6)活性:
C(C
C(A1、B6、C6)アクティブB
B(A1、B6、C4)アクティブB a1 b7 c7)active:

関連する問題