我遇到了this code,但我很难弄清楚这个功能的流程是如何运作的。
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, []);
}
我已经登录了一堆语句,但是我在递归时迷路了。具体来说,我不明白在返回两个fn
中的第一个之后发生了什么。它只是返回a
,但对我来说,好像第二个fn
知道接受返回的a
。这是如何运作的?它不应该像这样需要变量赋值:
a = fn(active + rest[0], rest.slice(1), a);
fn(active, rest.slice(1), a);
答案 0 :(得分:0)
好吧,如果您正在尝试了解特定的算法,那么关键的洞察力是a
变量通过引用累积结果 - 较低级别调用{{1}将单个元素推送到combinations()
,函数最终返回累积结果。
良好的印刷声明可以帮助理解这样的案例。这是添加了打印输出的代码,显示了您所处的递归级别。我将a
重命名为a
,使其更加明显:
accum
和结果:
function combinations(str) {
var fn = function(active, rest, accum, level) {
console.log(new Array(level).join('--'),
' active: \'' + active + '\'',
'rest: \'' + rest + '\'',
'accum:', accum);
if (!active && !rest)
return;
if (!rest) {
accum.push(active);
} else {
fn(active + rest[0], rest.slice(1), accum, level + 1);
fn(active, rest.slice(1), accum, level + 1);
}
return accum;
}
return fn("", str, [], 1);
}