我正在使用递归来处理置换str,但不能脱离for循环。
谁能帮忙提供此代码?
先感谢您。



    var permutations = [];
    var words = [];
    function getPerms(str) {

        if(str.length == 0) {
            permutations.push("");
            return permutations;
        }
        var first = str.charAt(0);//get the first char
        var reminder = str.slice(1);//remove the first char
        words = getPerms(reminder);
        for(var i = 0; i < words.length; i++) {
            for(var j = 0; j <= words[i].length; j++) {
                var s = insertCharAt(words[i], first, j);
                permutations.push(s);
            }
        }
        return permutations;
    }
    function insertCharAt(word, c, i) {
        var start = word.slice(0, i);
        var end = word.slice(i);
        var result = start + c + end;
        return result;
    }
    console.log(getPerms("abc"));

最佳答案

您的代码很好,除了以下问题之一:

变量permutations不应是全局变量。通过查看permutations.push(""),您可以清楚地看出这是错误的。作为最深层次递归的临时结果,这很好,但是显然,最终结果中不应出现这种情况。但是,由于permutations是全局的,并且您从不删除任何内容,因此permutations将保留此""

由于words从递归调用中获取permutations引用,因此问题变得更加严重,因此它们指向的是同一数组!因此,不仅所有先前的结果都将被迭代,而且还添加了额外的字符,它们将再次被推入permutations,该数组与words相同,从而为您带来无尽的循环:您添加了要迭代的数组,所以永远都不会结束。

解决方案很简单:

使permutations成为getPerms函数局部变量。并且为什么不对words做同样的事情。



function getPerms(str, depth=0) {
    var words = [];
    var permutations = [];

    if(str.length == 0) {
        permutations.push("");
        return permutations;
    }
    var first = str.charAt(0);//get the first char
    var reminder = str.slice(1);//remove the first char
    words = getPerms(reminder, depth+1);
    for(var i = 0; i < words.length; i++) {
        for(var j = 0; j <= words[i].length; j++) {
            var s = insertCharAt(words[i], first, j);
            permutations.push(s);
        }
    }
    return permutations;
}

function insertCharAt(word, c, i) {
    var start = word.slice(0, i);
    var end = word.slice(i);
    var result = start + c + end;
    return result;
}

console.log(getPerms("abc"));





确保检查此问题提供的these solutions

关于javascript - JavaScript排列问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48448645/

10-12 15:44