Цель c, обратный Collatz, помогите мне отладить NSArrays - PullRequest
1 голос
/ 21 декабря 2011

Я работаю над математическим проектом, использующим гипотезу Коллатца, я хочу сделать обратный график, как вы можете найти здесь, в Википедии , хотя я обнаружил, что где-то напутал в моем коде и он не показывает все обратные значения (например, он найдет одно нечетное значение из массива, затем то же значение * 2, но оно не пройдет мимо этого).

    #import "numberCreator.h"

@implementation numberCreator
@synthesize levels, nextX, nextY, numbers;

- (id)init
{
    self = [super init];
    if (self) {
        numbers         = [[NSMutableArray alloc]initWithCapacity:1000];//gives the array an estamated cap.
        currentLevel    = [[NSMutableArray alloc]initWithCapacity:25];
        nextLevel       = [[NSMutableArray alloc]initWithCapacity:25];
        checkNumbers    = [[NSMutableSet alloc]init];
    }

    return self;
}

//Creates all of the needed numbers in the reverce Collatz Web
- (void) create{
    [currentLevel addObject:[NSNumber numberWithInt:1]];
    [numbers addObject:[NSNumber numberWithInt:1]];
    [numbers addObject:[NSNumber numberWithInt:0]];
    [numbers addObject:[NSNumber numberWithInt:0]];
    [checkNumbers addObject:[NSNumber numberWithInt:1]];

    for(int x; x < levels; x++){
        for(int y; y < [currentLevel count]; y++){
            if([checkNumbers containsObject:[NSNumber numberWithInt:[[currentLevel objectAtIndex:y]floatValue]*2]]){}
            else{
                [checkNumbers addObject:[NSNumber numberWithInt:[[currentLevel objectAtIndex:y]intValue]*2]];

                [numbers addObject:[NSNumber numberWithInt:[[currentLevel objectAtIndex:y]intValue]*2]];
                [numbers addObject:[NSNumber numberWithInt:[[currentLevel objectAtIndex:y]intValue]]];//The array is set like Number, Parent, level
                [numbers addObject:[NSNumber numberWithInt:x+1]];

                [nextLevel addObject:[NSNumber numberWithInt:[[currentLevel objectAtIndex:y]intValue]*2]];
                if((y-1)/3%2==1){
                    if([checkNumbers containsObject:[NSNumber numberWithInt:([[currentLevel objectAtIndex:y]floatValue]-1)/3]]){}
                    else{
                        [checkNumbers addObject:[NSNumber numberWithInt:([[currentLevel objectAtIndex:y]intValue]-1)/3]];


                        [numbers addObject:[NSNumber numberWithInt:([[currentLevel objectAtIndex:y]intValue]-1)/3]];
                        [numbers addObject:[NSNumber numberWithInt:[[currentLevel objectAtIndex:y]intValue]]];
                        [numbers addObject:[NSNumber numberWithInt:x+1]];

                        [nextLevel addObject:[NSNumber numberWithInt:[[currentLevel objectAtIndex:y]intValue]*2]];
                    }
                }else{}
            }

        }

        [currentLevel removeAllObjects];
        for(int y; y < [nextLevel count]; y++){
            [currentLevel addObject:[nextLevel objectAtIndex:y]];
        }
        [nextLevel removeAllObjects];
    }

    for(int x; x < [numbers count]; x++){
        NSLog(@"%i", [[numbers objectAtIndex:x]intValue]);
    }
}

@end

1 Ответ

1 голос
/ 21 декабря 2011

Поскольку вы работаете только с целым числом, использование NSMutableIndexSet будет гораздо более эффективным.

#import "NumberCreator.h"

@implementation NumberCreator
@synthesize levels, numbers;

- (id)init
{
    if ( !(self = [super init] ) )
        return nil;

    numbers = [NSMutableIndexSet new];
    return self;
}

- (void)create
{
    [numbers removeAllIndexes];
    [numbers addIndex:1];

    NSMutableIndexSet *nextLevel = [NSMutableIndexSet indexSet];
    NSMutableIndexSet *currentLevel = [NSMutableIndexSet indexSetWithIndex:1];

    for (int i = 0; i < levels; i++ )
    {
        [currentLevel enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {

            if ( ! [numbers containsIndex:idx * 2] )
                [nextLevel addIndex:idx * 2];

            if ( idx % 6 == 4 && ! [numbers containsIndex:(idx - 1) / 3] )
                [nextLevel addIndex:(idx - 1) / 3];
        }];

        [numbers addIndexes:nextLevel];
        [currentLevel removeAllIndexes];
        [currentLevel addIndexes:nextLevel];
        [nextLevel removeAllIndexes];
    }

    [numbers enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
        NSLog(@"%i", idx);
    }];
}

@end
...