-(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)];
}
}
}
}
是列,x是行,mat是C矩阵
我在这里尝试做的是:我在矩阵中得到一个点next
,mat
(我将使用struct但是对于测试范围我使用CGPoint。 .it的基本相同的东西),为此我检查它是否在第一行,如果它不是我检查该值是否等于上面的行的值。如果是,我添加该点的坐标进入一个数组并移动到上面的值(递归)。我有左,右和下面的ifs ......但是这个想法是一样的。
我的问题:
答案 0 :(得分:2)
“有效”数组为零,因为您尚未分配它。 (您可以向nil指针发送addObject:消息或任何消息 - 它只是不执行任何操作。)确保您已经
valid = [[NSMutableArray alloc] init];
在你调用这段代码之前的某个地方。
此外,“!next.y == 0”值得怀疑。它可能会变成与“next.y!= 0”相同,即使!有一个更高的优先级==,但我不保证。这就是我现在所看到的,而没有真正了解这段代码试图做的事情。
哦,另一个快速注释:不要编写自己的isInArray,只需使用NSArray的containsObject:。然后检查方法的内部部分(第二个缩进)
NSValue* pointVal = [NSValue valueWithCGPoint:next];
if ( ![valid containsObject:pointVal] )
{
[valid addObject:next];
[self check:CGPointMake(ics-1, igrec)];
}
或者,如果您不关心有效数组中点的顺序,则可以使用NSMutableSet而不用担心检查该点是否已经在集合中。
是的,方法中的递归很好。它们与C函数真的相同,只有几个隐藏的参数(自指针和方法名称),并通过调度函数调用。