それは再帰を終了するたびに、それは、呼び出し元に戻ります(それは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
正確に知りたいことは本当に明確ではありません。私たちはあなたがその機能をどこに持っているのか、それがなぜ機能するのかを知りませんので、どんな答えを期待していますか?この関数は再帰的に呼び出しますが、呼び出しで2回呼び出されますが、理由は元の作者だけがあなたに伝えることができます。 – Connum
[再帰関数呼び出しのない順列](http://stackoverflow.com/questions/34013675/permutations-without-recursive-function-call)を参照してください。 – guest271314