递归过程中“结果”变量的替代方法

时间:2017-08-01 04:58:54

标签: javascript recursion scope fold

在遍历图,字符串问题和软件的各种问题中,为返回多个值(通常是数组)的内部递归过程维护“全局”状态的函数非常常见。

下面的函数permutations和变量results就是这种“模式”的一个这样的实例。 results存在于内部递归过程driver的范围内,但在对driver的任何调用完成后仍然存在,以便最终可以对其进行操作/返回/ 传递到回调。

function permutations(items) {
    var results = [];

    const driver = (members, idx) => {
        if (idx === members.length - 1) {
            // We have our desired result
            results.push(members.slice());
        } else {
            for(let i = idx; i < members.length; i++) {
                swap(members, idx, i);
                driver(members, idx + 1);
                swap(members, i, idx);
            }
        }
    }

    driver(items, 0);
    return results;
}

这些类型的过程偶尔可以转换为一系列递归语句,这些语句与concat链接在一起。它们也可能会转换为map / reduce的许多应用程序。

我怀疑这种模式已经在计算机科学和工业界产生了大量关于这些和其他方法背后的相对优点,性能细节和理论的文献。它们是什么?

0 个答案:

没有答案