Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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 JS递归函数-堆算法函数逻辑_Javascript_Recursion_Permutation - Fatal编程技术网

Javascript JS递归函数-堆算法函数逻辑

Javascript JS递归函数-堆算法函数逻辑,javascript,recursion,permutation,Javascript,Recursion,Permutation,我试图理解这个函数背后的逻辑: function permAlone(str) { arr = str.split(""); result = []; perm(arr, arr.length); return result; function perm(string, length){ if (length == 1){ result.push(string.join("")); } else { for (var

我试图理解这个函数背后的逻辑:

 function permAlone(str) {

  arr = str.split("");

  result = [];

  perm(arr, arr.length);
  return result;

  function perm(string, length){
    if (length == 1){
      result.push(string.join(""));
    }

    else {
      for (var i=0; i < length; i++){
       perm(string, length-1);

        if(length % 2 == 0){
         swap(string, i, length-1); 
         }

        else{
         swap(string, 0, length-1);
        }
      }


    }
  }

  function swap(array, first, second){
    var temp = array[first];
    array[first] = array[second];
    array[second] = temp;
  }
}

permAlone('aab');
函数permolone(str){
arr=str.split(“”);
结果=[];
perm(arr,arr.length);
返回结果;
函数perm(字符串、长度){
如果(长度==1){
result.push(string.join(“”));
}
否则{
对于(变量i=0;i
此函数返回所传递数组的排列。它在工作,但我真的不明白它是怎么工作的。如果结果数组只有一个push调用,那么它到底有多个置换?另外,perm函数被调用的次数是4次还是更少?我只是想了解这件事的逻辑。交换函数是不言自明的。我只是在perm函数的else语句中遇到了问题


提前感谢。

当然有不止一个
push()
,而且根据输入的长度,几乎肯定有超过4个调用
perm()
。我建议您添加
console.log(string)
作为
perm()
函数的第一行,然后查看输出——这应该有助于您理解。@dave,谢谢……我已经添加了console.log。。我想我现在可以理解了。因此,首先函数perm迭代直到length==1,然后它推送并中断函数。然后for循环继续,检查长度是偶数还是奇数add调用swap函数。然后for迭代并再次启动perm函数,直到for中的i到达i==长度。