2011-12-20 5 views
1

Collatz 추측을 사용하여 수학 공정 프로젝트에서 작업하고 있는데, 내가 어딘가에서 엉망이되었음을 발견했지만 here on wikipeadia을 찾을 수있는 것처럼 역 그래프를 만들고 싶습니다. 내 코드 및 모든 역방향 값을 표시하지 않습니다 (예 : 배열에서 하나의 홀수 값을 찾은 다음 동일한 값 * 2을 표시하지만지나 가지 않습니다).Objective c, reverse Collatz NSArrays를 디버그하는 데 도움이됩니다.

#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 
+3

게시물 본문에 관련 코드를 넣으십시오. 그래서 모든 질문은 자체적으로 포함되어야합니다. pastebin이 해당 페이지를 삭제하면 귀하의 질문은 향후 독자에게 쓸모 없게됩니다. –

답변

1

정수로만 작업하기 때문에 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 
+0

고마워요! 객관적으로 필요한 리소스를 더 많이 배울 필요가 있습니다. 나에게 답하기 전에 NSMutableIndexSet에 대해 알지 못했습니다. 더 많은 언어를 배우기 위해 사용해야하는 훌륭한 자료를 알고 있습니까? – coopf