javascript中所有可能的组合 - 为什么pop()?

时间:2015-11-06 20:46:09

标签: javascript algorithm recursion

我正在尝试理解我在网上遇到的这个函数,该函数返回字符串的所有可能组合 - 为什么nextLetter.pop需要pop()调用?我尝试在控制台中对此进行调试,但目前尚不清楚pop的确切内容。

结果与nextLetter.pop()---> ['bac','bca','cba','cab','acb','abc']

没有nextLetter.pop()的结果 - > ['bac',   '浆果',   'baccacba',   'baccacbaab',   'baccacbaabacb',   'baccacbaabacbbc']

function stringPermutations(str) {
  var permutations = [];
  var nextLetter = [];
  var chars = str.split('');

  permutateInner(chars);



  function permutateInner(chars) {
    if (chars.length === 0) {

      permutations.push(nextLetter.join(''));
    }
    for (var i = 0; i < chars.length; i++) {


      chars.push(chars.shift());

      nextLetter.push(chars[0]);

      permutateInner(chars.slice(1));
      //what is this doing?

      nextLetter.pop();

    }
  }
  return permutations;
}

console.log(stringPermutations('abc'));

2 个答案:

答案 0 :(得分:0)

从顶部开始,很清楚nextLetterArray - 所以我看到的第一个地方就是docs on MDN

正如文档所述,.pop()方法从Array中移除了最后一个元素并将其返回 - 在示例代码中,返回值未被使用,所以很明显&# 39;有用的是删除最后一个元素的副作用。

答案 1 :(得分:0)

permutateInner(chars.slice(1));对数组子集[1..n]进行递归。它包含在当前数组的每个子数组中也有排列。

e.g。当前第一个字母为b时,递归包括排列acca。当前第一个字母为a时,递归包括排列cbbc

将它放在那里是至关重要的,否则你只会获得结果[&#39; abc&#39;,&#39; bca&#39;&#39; cba&#39; ]