Objective-C,计算一组值的所有可能总和以达到结果目标

Objective-C, Calculate all possible sum of a group values to reach a result target

我想在 Objective-C 中开发所有可能的总和以得出结果,就像在另一个线程中一样,但在 Objective-C

Example in JAVA

JAVA中的代码是:

public void sum_up_recursive(ArrayList<Integer> numbers, int target, ArrayList<Integer> partial) {
           int s = 0;
           for (int x: partial) s += x;
           if (s == target){
                System.out.println("sum("+Arrays.toString(partial.toArray())+")="+target);
           }
           if (s >= target)
                return;
           for(int i=0;i<numbers.size();i++) {
                 ArrayList<Integer> remaining = new ArrayList<Integer>();
                 int n = numbers.get(i);
                 for (int j=i+1; j<numbers.size();j++) remaining.add(numbers.get(j));
                 ArrayList<Integer> partial_rec = new ArrayList<Integer>(partial);
                 partial_rec.add(n);
                 sum_up_recursive(remaining,target,partial_rec);
           }
        }

我在 Objective-C 中的意图:

主要课程:

    NSMutableArray *numbers = [[NSMutableArray alloc] init];

    [numbers addObject:@2];
    [numbers addObject:@4];
    [numbers addObject:@8];
    [numbers addObject:@16];
    [numbers addObject:@32];

    NSMutableArray *partial = [[NSMutableArray alloc] init];

    [testclass sum_up_recursive:numbers : 12 :partial];

方法:

- (void) sum_up_recursive: (NSMutableArray*) numbers: (int) target:(NSMutableArray*) partial{

    NSInteger s = 0;

    for (NSNumber *x in partial){
        s = s + [x integerValue];        
    }

    if (s == target){
        NSLog(@"RESULT: %@", partial);
    }

    if (s >= target){
        return;
    }

    for (NSInteger i = 0 ; i < [numbers count]; i++) {

        NSMutableArray* remaining;
        NSInteger n = [numbers objectAtIndex:i];

        for (NSInteger j=i+1 ; j < [numbers count]; j++) {
            [remaining addObject:[numbers objectAtIndex:j]];
        }

        NSMutableArray *partial_rec = partial;
        [partial_rec addObject: [NSNumber numberWithInteger:n]];

        [self sum_up_recursive:remaining:target:partial_rec];
    }

}

我没有错误,但我没有结果,我无法达到目标值,我是一名 Android 开发人员可能任何有更多经验的人都可以看到我的代码中有什么错误或给个意见。

我修复了错误,这个方法非常有效:

- (void) sumUpRecursive:(NSMutableArray *)numbers withTarget:(NSInteger)target withPartial:(NSMutableArray *)partial {

    NSInteger s = 0;

    for (NSNumber *x in partial){
        s = s + [x integerValue];
    }

    if (s == target){
        NSLog(@"RESULT: %@", partial);
    }

    if (s >= target){
        return;
    }

    for (NSInteger i = 0; i < [numbers count]; i++) {

        NSMutableArray *remaining = [[NSMutableArray alloc] init];
        NSInteger n = [[numbers objectAtIndex:i] integerValue];

        for (NSInteger j = i + 1; j < [numbers count]; j++) {
            [remaining addObject:[numbers objectAtIndex:j]];
        }

        NSMutableArray *partial_rec = [[NSMutableArray alloc] init];
        [partial_rec addObjectsFromArray:partial];

        [partial_rec addObject: [NSNumber numberWithInteger:n]];

        [self sumUpRecursive:remaining withTarget:target withPartial:partial_rec];
    }

}

这个方法的输出是:

数字(2、4、8、16、32)

1) 示例,求和目标:12,输出:4, 8 表示.. 4+8.

2) 示例,求和目标:14,输出:2、4、8。

3) 示例,求和目标:44,输出:4、8、32

这个问题不是重复的,因为在另一个问题中,想法是搜索所有组合以求和,但问题只适用于 2 个数字,在我的情况下,我需要尝试使用 N+ 个数字。

首先,您的方法使用了非常不标准的语法。

- (void) sum_up_recursive: (NSMutableArray*) numbers: (int) target:(NSMutableArray*) partial{

通常你会做这样的事情

- (void)sumupRecursive:(NSMutableArray*)numbers target:(int)target partial:(NSMutableArray*)partial

然后调用类似于

[self sumupRecursive:numbers target:100 partial:someOtherArray];

代码中的两个错误是 "remaining" 将始终为 nil,因为您从未将其设置为可变数组,并且 "NSInteger n = [numbers objectAtIndex:i]" 不应编译; objectAtIndex returns 一个 NSNumber* 而不是一个 NSInteger。

我什至没有试图理解代码应该做什么。

我希望您的方法定义看起来更像下面这样:

- (void) sum_up_recursive:(NSMutableArray *)numbers withTarget:(NSInteger)target withPartial:(NSMutableArray *)partial

我无法真正遵循方法的 Objective-C 标准,因为我不知道您的方法实际在做什么。

我对你的方法的尝试(我不知道 Java)如下(代码未测试):

- (void) sumUpRecursive:(NSMutableArray *)numbers withTarget:(NSInteger)target withPartial:(NSMutableArray *)partial {

    NSInteger s = 0;

    for (NSNumber *x in partial){
        s = s + [x integerValue];        
    }

    if (s == target){
        NSLog(@"RESULT: %@", partial);
    }

    if (s >= target){
        return;
    }

    for (NSInteger i = 0; i < [numbers count]; i++) {

        NSMutableArray *remaining = [[NSMutableArray alloc] init];
        NSInteger n = [[numbers objectAtIndex:i] integerValue];

        for (NSInteger j = i + 1; j < [numbers count]; j++) {
            [remaining addObject:[numbers objectAtIndex:j]];
        }

        // Initial code
        //NSMutableArray *partial_rec = partial;
        //[partial_rec addObject: [NSNumber numberWithInteger:n]];

        // Correct code from OP
        NSMutableArray *partial_rec = [[NSMutableArray alloc] init];
        [partial_rec addObjectsFromArray:partial];

        [self sumUpRecursive:remaining withTarget:target withPartial:partial_rec];
    }

}

您可以这样称呼它:

NSMutableArray *numbers = [[NSMutableArray alloc] init];

[numbers addObject:@2];
[numbers addObject:@4];
[numbers addObject:@8];
[numbers addObject:@16];
[numbers addObject:@32];

NSMutableArray *partial = [[NSMutableArray alloc] init];

[testclass sumUpRecursive:numbers withTarget:12 withPartial:partial];

我不太确定这是一个答案,但评论太长了。如果您编辑您的问题以提供预期输出和实际输出,您将获得更好的答案。