我在Chrome调试器中一遍又一遍地检查了此功能,但仍然不了解return a
的作用。感谢您的帮助!
以下是一些澄清:我了解第一轮。使用以下参数调用匿名函数:
active =“”,rest =“ abc”,a = []
然后填充rest
数组时,它自称直到a
为空:
active =“ abc”,rest =“”,a = [“ abc”]
此时,我们到达return a
,调试器跳到else语句中的第二个fn调用,而不是第一个if语句。参数已经看起来像这样:
active =“ ab”,rest =“ c”,a = [“ abc”]
这是我根本不了解的部分。我知道递归仅在active
和rest
为空时结束,但是在return a
之后,if语句甚至没有在调试器中得到检查,它只是突出显示了提到的第二个函数调用,在这一点上,“ c“已分配给rest
。我猜想这个函数不会产生重复项的原因也就在这里,但这可能是另一个问题。无论如何,再次感谢您的帮助!
combinations("abc");
function combinations(str) {
var fn = function(active, rest, a) {
if (!active && !rest)
return;
if (!rest) {
a.push(active);
} else {
fn(active + rest[0], rest.slice(1), a);
fn(active, rest.slice(1), a);
}
return a;
}
return fn("", str, []);
}
function combinations(str) {
var fn = function(active, rest, a) {
if (!active && !rest) {
// base case #1 - implicit return, no recursive call
} else if (!rest) {
// base case #2 - implicit return, no recursive call
a.push(active);
} else {
// recursive case, where function is called again
// (the object "a" is modified in recursion;
// result of recursion not directly used)
fn(active + rest[0], rest.slice(1), a);
fn(active, rest.slice(1), a);
}
}
var o = []; // only one output object created..
fn("", str, o); // ..mutated..
return o; // ..and returned to caller.
}
然后应该很容易观察到,不需要将“ a”传递给递归函数(即,它可以访问封闭范围内的“ o”),因为在初始结果之后没有分配给“ a”的新对象数组已创建。
重写将有一个细微的差别(将更正确地返回一个空数组,用于一个空的输入字符串。