在此递归组合函数中“ return a”有什么作用?

问题描述 投票:1回答:1

我在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”]

这是我根本不了解的部分。我知道递归仅在activerest为空时结束,但是在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, []);
}
javascript recursion permutation
1个回答
0
投票
这里是更干净的重写器,使用了辅助功能。我也删除了所有显式return语句,因为它们在这里没有增加价值。

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”的新对象数组已创建。

重写将有一个细微的差别(将更正确地返回一个空数组,用于一个空的输入字符串。
© www.soinside.com 2019 - 2024. All rights reserved.