递归列表拆分(javascript)
Recursive list split (javascript)
假设我有一个数组 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
依次划分为多个切片。所以在这个例子中,我首先将它分成 2 个大小相等的列表(m[0]
是 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]
是 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]]]
然后最后将每个列表分成 2 个列表(m[2]
是 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]]]]
在实际实现中,m
将具有任意长度和任意值。
有没有现成的算法可以做到这一点?这基本上是一个树结构,因为除法产生的每个列表都会收到一个标签,但我不确定如何实现一个函数来 return 我需要的列表。我在 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]));
假设我有一个数组 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
依次划分为多个切片。所以在这个例子中,我首先将它分成 2 个大小相等的列表(m[0]
是 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]
是 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]]]
然后最后将每个列表分成 2 个列表(m[2]
是 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]]]]
在实际实现中,m
将具有任意长度和任意值。
有没有现成的算法可以做到这一点?这基本上是一个树结构,因为除法产生的每个列表都会收到一个标签,但我不确定如何实现一个函数来 return 我需要的列表。我在 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]));