2012-04-12 36 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