Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript递归数置换_Javascript_Recursion_Permutation - Fatal编程技术网

Javascript递归数置换

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) {

当我输入这个函数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(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的情况下工作