需要帮助了解递归函数以生成字符串的所有组合

时间:2016-07-31 20:55:14

标签: javascript recursion combinations

我遇到了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);

1 个答案:

答案 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);
}