递归列表拆分(javascript)

递归列表拆分(javascript),javascript,algorithm,tree,Javascript,Algorithm,Tree,假设我有一个数组l: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24] 它包含一组值,在本例中为整数。我还有另一个数组m: [2,3,2] 它包含除数(稍后我将解释我所说的除数)。我想做的是根据m中的当前值,依次将l划分为多个片。因此在本例中,我首先将其划分为两个大小相同的列表(m[0]is 2): [[1,2,3,4,5,6,7,8,9,10,11,12],[13,14,15,16,17,18,19,20,21,2

假设我有一个数组
l

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]

它包含一组值,在本例中为整数。我还有另一个数组
m

[2,3,2]

它包含除数(稍后我将解释我所说的除数)。我想做的是根据
m
中的当前值,依次将
l
划分为多个片。因此在本例中,我首先将其划分为两个大小相同的列表(
m[0]
is 2):

[[1,2,3,4,5,6,7,8,9,10,11,12],[13,14,15,16,17,18,19,20,21,22,23,24]

然后将这些列表划分为3个(
m[1]
is 3)列表,得到:

[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20],[21,22,23,24]。

然后最后将这些列表中的每一个划分为两个列表(
m[2]
is 2):

在实际实现中,
m
将具有任意长度和任意值

有没有一个现有的算法可以实现这一点?这基本上是一个树形结构,因为每个由除法生成的列表都会收到一个标签,但我不确定如何实现一个函数来返回我需要的列表。我用Javascript实现,但算法在这里很重要。

请参见


这可能是你解决问题的第一步。下一步是递归拆分每个数组

试试这段代码。它递归地拆分数组

function split(arr, n) {
  if(n <= 1) return [arr];
  var partLength = Math.ceil(arr.length/n),
      part1 = arr.slice(0, partLength),
      result = split(arr.slice(partLength), n - 1);
  result.unshift(part1);
  return result;
}

function splitTree(arr, m) {
  if(m.length < 1) return arr;
  var result = split(arr, m[0]);
  return result.map(function(sublist) {
    return splitTree(sublist, m.slice(1));
  });
}

var l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24];

console.log(splitTree(l, [2,3,2]));
功能拆分(arr,n){

如果(n我在这里没有看到任何树结构,如果数组长度小于分隔符大小,会发生什么情况?@MaxZoom I可能应该更清楚;前2个列表中的所有元素都将收到一个标签,并将在所有分区中保留该标签。因此,1-12将有一个标签“a”,13-24将有一个标签“b”,在下一个step,1-4将有标签“c”,5-8将有标签“d”,依此类推。是树,我的意思是结构有节点,是分层的。