Javascript递归数置换
当我输入这个函数85时,它只返回85。我不明白为什么不以5作为第一个数字,再次递归地呼叫自己Javascript递归数置换,javascript,recursion,permutation,Javascript,Recursion,Permutation,当我输入这个函数85时,它只返回85。我不明白为什么不以5作为第一个数字,再次递归地呼叫自己 console.log(PermutationStep(85)); function PermutationStep(num) { var perms = []; rec(String(num), String(num).length, [], ''); return perms; function rec(num, numLength, used, currPerm) {
console.log(PermutationStep(85));
function PermutationStep(num) {
var perms = [];
rec(String(num), String(num).length, [], '');
return perms;
function rec(num, numLength, used, currPerm) {
console.log(currPerm);
if (currPerm.length === numLength) {
perms.push(num);
}
for (var j=0; j<numLength; j++) {
if (used[j]) continue;
else {
used[j]=true;
rec(num, numLength, used, currPerm+num[j]);
}
}
}
}
console.log(置换步骤(85));
函数置换步骤(num){
var perms=[];
rec(字符串(num),字符串(num).length,[],'';
回烫;
函数记录(num、numLength、used、currPerm){
console.log(currPerm);
如果(currPerm.length==numLength){
烫发推送(num);
}
对于(var j=0;j
当达到长度时,应按currPerm
而不是num
跟踪后,使已使用[j]
再次可用
它可能会产生重复的结果,如885
,您需要确保它没有跟踪相同的值
console.log(置换步骤(85));
console.log(置换步骤(885));
函数置换步骤(num){
var perms=[];
//将数字转换为字符数组。
var str=(''+num).split('');
变量长度=str.length;
//按字母顺序排序。
str.sort(函数(a,b){
返回a-b;
});
//创建使用过的地图。
var used=str.map(函数(){
返回false;
});
rec(str,);
回烫;
//并不是说javascript可以引用外部函数范围中的值,
//所以我们不需要每次都传递长度和使用,就像你用烫发一样。
函数rec(num,currPerm){
console.log(currPerm);
if(currPerm.length==长度){
//将构造的字符串放在这里,而不是num
烫发推(currPerm);
}
var-prev=null,ch;
对于(var j=0;j }
在rec in for循环完成后,您需要将used[j]
设置回false
。如果used最初是[],那么在第一次递归调用之后,它将是[true]且j=1。used[1]如果为false,那么它为什么不进行第二次递归调用呢?因为您要检查第二个数字,即第二个嵌套的rec
,它会将used[1]
标记为true
。因此,当您返回到第一个rec
,并循环到j=1
,使用的是[true,true]
,因此它被跳过。当您传递rec(num,numLength,used,currPerm+num[j]);
时,请注意javascript将指向used
的引用指针传递给rec
,因此如果您在嵌套函数中修改used
,它也会修改使用它的外部函数。即使您使用used.slice(0)
要传递用于嵌套rec
的副本,在嵌套rec
完成后,您仍然必须将其设置回false,例如,在索引0
的结果完成后(85
),使用的为[真,未定义]
,然后在j=1
,如果您没有设置使用的[0]
返回到false,您将把[true,true]
传递到nest,它将不生成任何内容,因为它看到所有使用的都是true。我刚刚用used.slice(0)尝试了它,它在不设置false的情况下工作