我正在尝试自定义此处给出的解决方案中的组合方法:Combinations of different NSArray objects,以便它使用递归,而不是使用迭代给出的解决方案。我试图自定义此函数的原因是为了提高此函数的性能,因为当数组开始变大并且有许多组合需要计算时,它会开始显着减慢。
关于如何做到这一点的任何建议?
答案 0 :(得分:0)
我认为你必须结合迭代和递归。如果你想让它做不同数量的阵列,那么我想出了类似的东西......
首先通过迭代方法。
- (NSArray *)combineArrays:(NSArray *)arrays
{
// arrays is an array of arrays of elements that you want to combine.
NSMutableArray *combinations = [NSMutableArray array];
for(NSArray *array in arrays) {
NSMutableArray *temp = [NSMutableArray array];
for (id element in array) {
if (combinations.count == 0) {
// the first level of the array is just all the elements from the first array
[temp addObject:@[element]];
} else {
// copy each array in combinations for each new element and add new element to end
for (NSArray *array in combinations) {
[temp addObject:[array arrayByAddingObject:element];
}
}
}
// save the current combinations
combinations = temp;
}
return combinations;
}
我几乎可以肯定中间部分可以递归到一个方法中。现在正在努力。
- (NSArray *)combineArray:(NSArray *)combinations withArrays:(NSMutableArray *)arrays
{
// if there are no arrays to combine then you are at the end of recursion so return combinations.
if (!array || array.count == 0) {
return combinations;
}
// to start with you "combine" the first array with an empty array
if (!combinations) {
combinations = @[@[]];
}
NSMutableArray *newCombinations = [NSMutableArray array];
NSArray *array = [arrays firstObject];
for (id element in array) {
for (NSArray combination in combinations) {
[newCombinations addObject:[combination arrayByAddingObject:element];
}
}
[arrays removeObjectAtIndex:0];
return [self combineArray:newCombinations withArrays:arrays];
}
这样的事可能有用。但它并不比迭代更快。
看看这个答案JavaScript - Generating combinations from n arrays with m elements,它可以在JavaScript中完成你想要的工作。你仍然需要触摸每个数组的每个元素。