我正在使用递归来处理置换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/