我的代码中有这么大的循环(不是选择),因为我似乎无法以任何其他方式使其工作。如果有一些方法可以让这个变得简单而不是我重复它20次就会很棒,谢谢。
for (NSUInteger i = 0; i < 20; i++) {
if (a[0] == 0xFF || b[i] == a[0]) {
c[0] = b[i];
if (d[0] == 0xFF) {
d[0] = c[0];
}
... below repeats +18 more times with [i+2,3,4,etc] ...
if (a[1] == 0xFF || b[i + 1] == a[1]) {
c[1] = b[i + 1];
if (d[1] == 0xFF) {
d[1] = c[1];
}
... when it reaches the last one it calls a method ...
[self doSomething];
continue;
i += 19;
... then } repeats +19 times (to close things)...
}
}
}
我已经尝试了几乎所有可能的组合,我知道这些组合试图使其更小更有效。看看我的流程图 - 非常嗯?我不是个疯子,诚实。
答案 0 :(得分:3)
如果我没有犯错:
for (NSUInteger i = 0; i < 20; i++) {
BOOL canDoSomething = YES;
for (NSUInteger j = 0; j < 20; j++) {
if (a[j] == 0xFF || b[i+j] == a[j]) {
c[j] = b[i+j];
if (d[j] == 0xFF) {
d[j] = c[j];
}
}
else {
canDoSomething = NO;
break;
}
}
if (canDoSomething) {
[self doSomething];
break;
// according to your latest edit: continue; i+=19;
// continue does nothing as you use it, and i+=19 makes i >= 20
}
}
这是你的代码所做的。但看起来它会导致索引输出边界异常。 也许嵌套循环的子句应该看起来像
for (NSUInteger j = 0; i+j < 20; j++)
答案 1 :(得分:0)
你想使用递归。
声明另一种方法:
-(BOOL)doSthWithA:(int*)a B:(int*)b C:(int*)c D:(int*)d Integer:(int)j AnotherInteger:(int)i {
// end of recursion
if(j == 20) {
return YES;
}
if (a[j] == -0x1 || b[i+j] == a[j]) {
c[j] = b[i+j];
if (d[j] == -0x1) {
d[j] = c[j];
}
return doSthWithA:a B:b C:c D:d Integer:j+1 AnotherInteger:i;
}
else return NO;
}
并在您的代码中:
for (NSUInteger i = 0; i < 20; i++) {
if(doSthWithA:a B:b C:c D:d Integer:0 AnotherInteger:i;) {
[self doSomething];
i+=19;
}
}
可能一切都做得更好,但这会将您的代码转换为更紧凑的形式。