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

时间:2015-09-27 19:15:23

标签: 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 个答案:

答案 0 :(得分:1)

我注意到您的实施中存在1个问题 在permute中permute( i, string );,不是修改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