2012-04-12 6 views
0
-(BOOL)isInArray:(CGPoint)point{ 
    if ([valid count]==0) { 
     return NO; 
    } 

    for (NSValue *value in valid) { 
     CGPoint er=[value CGPointValue]; 

     if(CGPointEqualToPoint(point,er)) return NO; 
    } 
    return YES; 
} 



-(void)check:(CGPoint)next{ 

if (!next.y==0) { 

    int ics=(int) next.x; 
    int igrec=(int)next.y; 

    if (mat[ics][igrec]==mat[ics-1][igrec]){ 

     if (![self isInArray:next]) { 
      [valid addObject:[NSValue valueWithCGPoint:next]]; 
      NSLog(@"valid y!=0 : %@",valid); 

      [self check:CGPointMake(ics-1, igrec)]; 
     } 
    } 
} 

}рекурсии в методах, алгоритм и NSValue вопрос

у являются столбцы, х являются строки, мат представляет собой матрицу C

то, что я пытаюсь сделать здесь заключается в следующем: я получаю point, next, в матрице, mat (я буду использовать struct, но для области тестирования я использую CGPoint ... это то же самое), и для этого я проверяю, находится ли он в первой строке, и если это не i проверьте, соответствует ли значение значению строки выше. Если это так, я добавляю координату точки в массив и перехожу к значению выше (рекурсивно). У меня есть ifs для левой, правой и ниже тоже ... но идея такая же.

Мои вопросы:

  • почему-то не работает, как и должно быть, даже с матом полным 1 значений
  • NSMutableArray я использую для хранения точек всегда нуль (заметим, что NSLog получает вызов, поэтому он должен был добавить объект уже)
    • Рекурсивно работает с методами?
    • Если у вас есть лучшее представление о том, как это сделать ... я слушаю

ответ

2

«действительный» массив равен нулю, потому что вы не выделили его. (Вы можете отправить AddObject: сообщение, или любое сообщение, до нулевого указателя - это просто ничего не делает.) Убедитесь, что у вас есть

valid = [[NSMutableArray alloc] init]; 

где-то прежде, чем вы вызываете этот код.

Кроме того, «! Next.y == 0» вызывает сомнения. Это может оказаться идентичным «next.y! = 0», даже если! имеет более высокий приоритет ==, но я бы не гарантировал этого. Это все, что пятно на данный момент, на самом деле не grokking, что этот код пытается сделать ..


О, еще один быстрый Примечание: Вместо того чтобы писать свой собственный isInArray, просто использовать containsObject NSArray в :. Внутренняя часть методы проверки (второй абзац) затем

NSValue* pointVal = [NSValue valueWithCGPoint:next]; 

if (![valid containsObject:pointVal]) 
{ 
    [valid addObject:next]; 
    [self check:CGPointMake(ics-1, igrec)]; 
} 

Или, если вы не заботитесь о порядке точек в действительном массиве вы могли бы использовать вместо NSMutableSet и не беспокоиться о проверке, если точка уже находится в коллекции.

И да, рекурсия в методах в порядке. Они действительно такие же, как функции C, только с несколькими скрытыми аргументами (указатель на ядро ​​и имя метода) и вызываются через функцию отправки.

+0

хорошо..и теперь использую NSSet, перемещал некоторые вещи вокруг ... он работает..Но он не работает так, как должен .. я попытаюсь исправить это, но если он не работает, я поставлю код здесь ... может быть, вы можете мне помочь :) – skytz

+0

, поэтому я пришел к выводу, что он не называет '[self check: CGPointMake (ics-1, igrec)];' ... любые идеи? (или если он делает это ... он не работает рекурсивно) – skytz

+0

казалось, что это была ошибка с моей стороны .. маленькая ... но теперь она отлично работает .. спасибо – skytz

Смежные вопросы