Javascript:打印字符串的排列超出堆栈内存?

标签 javascript algorithm

我有一个类似于 here 的方法,但是,对于我的代码片段,我似乎用完了 2 或 3 个字符的字符串。

这是一个实现问题吗?或者我需要在这里优化我的代码吗?

function swap(string, a_id, b_id){
    var swapped = new String();
    for (var i = 0; i < string.length; i++){
        if (i == a_id)
            swapped += string[b_id];
        else if (i == b_id)
            swapped += string[a_id]
        else
            swapped += string[i];
    }
    return swapped;
}

function permute(index, string){
    if (index == (string.length -1)){
        console.log(string);
    }
    else{
        for (var i = index; i <= string.length-1; i++){
            string = swap( string, i, index );
            permute( i, string );
            string = swap(string, i, index ); // undo it for the next iteration
        }
    }
}

permute(0, "AB");

最佳答案

我注意到您的实现中存在 1 个问题 permute( i, string ); 在 permute 内部,没有修改 i 值,这意味着它必须减少,i 值以某种方式在循环中的某处停止递归。

发现逻辑很难理解,当我看到你的实际执行linked .

String.prototype.replaceAt=function(index, character) {
    return this.substr(0, index) + character + this.substr(index+character.length);
}

//get new string
function swap(string, leftIndex, iIndex) {
    //console.log(string);
    var charAtL = string.charAt(leftIndex);
    var charAtI = string.charAt(iIndex);
    string = string.replaceAt(leftIndex, charAtI);
    string = string.replaceAt(iIndex, charAtL);
    return string;
}

function permute(string, leftIndex, rightIndex) {
    if (leftIndex == rightIndex) {
        console.log(string);
    } else {
        for(var i = leftIndex; i <= rightIndex; i++) {
            string = swap(string, leftIndex, i);
            permute(string, leftIndex + 1, rightIndex);
            string = swap(string, leftIndex, i);
        }
    }
}
permute("ABC", 0, 2);

我刚刚重新编写了整个程序,并且运行良好。检查控制台的所有排列值。

这是工作 fiddle .

关于Javascript:打印字符串的排列超出堆栈内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32811839/

相关文章:

javascript - 如何避免观察者突变中的代码重复

javascript - 如何访问该函数内的数据?我相信这是一个 promise ,但我不确定

算法 - 双端选择排序真的比单端选择排序快吗?

algorithm - 从每个列表中查找至少一个数字所属的最小范围

algorithm - 在未知大小的加权有向图上,如何从最短到最长迭代两个顶点之间的所有可能的非循环路径?

javascript - 上传图片并重定向到新页面,无需刷新

javascript - 如何检查所有属性值是否为真?

javascript - Javascript 原型(prototype)继承中数组和数字数据类型之间有区别吗?

algorithm - 加权快速联合解释

algorithm - 使用 n 个节点之间的 k 个链接最小化总距离