使用递归而不是使用迭代来构建组合

时间:2014-10-16 10:41:07

标签: ios objective-c recursion nsarray

我正在尝试自定义此处给出的解决方案中的组合方法:Combinations of different NSArray objects,以便它使用递归,而不是使用迭代给出的解决方案。我试图自定义此函数的原因是为了提高此函数的性能,因为当数组开始变大并且有许多组合需要计算时,它会开始显着减慢。

关于如何做到这一点的任何建议?

1 个答案:

答案 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中完成你想要的工作。你仍然需要触摸每个数组的每个元素。