2012-04-12 40 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问题

y的列,X都行,垫子是C矩阵

什么,我想在这里做的是这样的:我得到一个点,next,在一个矩阵中,mat(我会使用结构,但对于测试范围,我使用CGPoint.it的基本相同的东西),并为此,我检查它是否在第一行,如果它不是我检查该值是否等于上述行的值。如果是,则将该点的坐标添加到数组中,并移至上面的值(递归)。我也有左,右,下的ifs ...但这个想法是一样的。

我的问题:

  • 出于某种原因,它不因为它应该工作,即使采用了全1倍的值
  • 的NSMutableArray里我使用存储点的垫子总是空(注意, NSLog得到调用,所以它应该已经添加了一个对象)
    • 递归性是否与方法一起工作?
    • 如果你有更好的想法如何做到这一点......我听

回答

2

“有效”数组是零,因为你还没有分配它。 (您可以发送ADDOBJECT:消息,或任何消息,到零指针 - 它只是没有做任何事情。)确保你有

valid = [[NSMutableArray alloc] init]; 

你调用这个代码在什么地方。

此外,“!next.y == 0”值得怀疑。它可能会变成与“next.y!= 0”相同,即使!具有更高的优先级==,但我不能保证它。这就是我当场就目前而言,没有真正所著的Grokking一下这个代码是试图做...


哦,另一快速注:除了写自己的isInArray的,只是使用NSArray的containsObject :.检查方法(第二突出部)的内部是那么

NSValue* pointVal = [NSValue valueWithCGPoint:next]; 

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

或者,如果你不关心点的顺序在有效阵列,你可以使用的NSMutableSet代替,而不是担心如果检查这一点已经在集合中。

是的,方法中的递归很好。它们与C函数非常相似,只是有一对隐藏的参数(自指针和方法名),并通过调度函数调用。

+0

0123..n'm现在使用NSSet,移动了一些东西......它的工作原理..但它不工作,因为它应该..我会尝试修复它,但如果它不工作,我会把代码在这里......也许你可以帮助我一些:) – skytz 2012-04-12 17:25:51

+0

所以我断定它不会调用'[自检:CGPointMake(ics-1,igrec)];'...任何想法? (或者如果它...它不能递归地工作) – skytz 2012-04-12 17:40:25

+0

它似乎是我的一部分的错误..一个小..但现在它完美的工作..谢谢 – skytz 2012-04-12 17:57:19