我正在使用recursive来处理permutation str,但它无法摆脱for循环。 任何人都可以帮助这个代码吗? 提前谢谢。
new_user = User.objects.create_user(user.username, password=password)
答案 0 :(得分:1)
您的代码很好,除了一个问题:
变量permutations
不应该是全局变量。通过查看permutations.push("")
,您可以清楚地看到这是错误的。这可以作为最深层递归的临时结果,但显然这不应该存在于最终结果中。但是,因为permutations
是全局的,并且您永远不会从中删除任何内容,permutations
将保留此""
。
问题变得更糟,因为words
从递归调用中获取permutations
引用,因此它们指向 非常相同的 数组!因此,不仅迭代了所有以前的结果,而且添加了额外的字符,它们会被再次推送到permutations
,这是与{{相同的数组 1}}给你一个无限循环:你添加到你正在迭代的数组,所以永远不会到最后。
解决方案很简单:
使words
成为permutations
函数的本地变量。为什么不在getPerms
做同样的事情。
words
请务必检查为此问题提供的these solutions。
答案 1 :(得分:0)
问题可能在最后一次调用你返回的排列,然后将它分配给单词(你在这里做的就像是单词=排列),但这不是副本的分配,而是通过引用(因为{{1} }和words
属于相同的范围+它们是数组),所以从最后一次调用它们是同一个对象(当代码取消堆栈之前的调用时,它们现在是同一个对象)。为了说明,请执行以下代码。当您修改permutations
时,您会看到修改words
:
permutations
在你的代码中,你循环单词并同时修改排列(因此,基于前面的解释,就像修改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);
words.push("foo");
console.log( permutations);
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"));
并在同一时间循环words
),正是这些东西创造了无限循环。
我没有检查你的算法是否有效,我只是指出代码的问题。
所以我认为你想要的是:
words