JavaScript Permutation Issuse

时间:2018-01-25 17:23:26

标签: javascript

我正在使用recursive来处理permutation str,但它无法摆脱for循环。 任何人都可以帮助这个代码吗? 提前谢谢。

new_user = User.objects.create_user(user.username, password=password)

2 个答案:

答案 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