在Objective-C中通过X个嵌套数组循环的动态方式

在Objective-C中通过X个嵌套数组循环的动态方式,objective-c,loops,recursion,cocos2d-iphone,nsmutablearray,Objective C,Loops,Recursion,Cocos2d Iphone,Nsmutablearray,我正在创建一个iPhone游戏,并创建了线对象,每个线对象都有自己的属性,例如它们的x、y坐标和一个“已连接”数组,该数组详细描述了当前接触“此”线的所有其他线 我要做的是从一条起始线Line1开始,迭代它的其他连接线数组,然后从那里随机选择另一条线,比如Line2。然后,我想重复此逻辑,查看所有Line2s连接线阵列,并选择另一条连接线,但它刚刚来自的线除外,即不是Line1。简而言之,我想知道一组线是否完成了一个“电路”,即最后一行==第一行so 伪代码: Line1->Line1Array

我正在创建一个iPhone游戏,并创建了线对象,每个线对象都有自己的属性,例如它们的x、y坐标和一个“已连接”数组,该数组详细描述了当前接触“此”线的所有其他线

我要做的是从一条起始线Line1开始,迭代它的其他连接线数组,然后从那里随机选择另一条线,比如Line2。然后,我想重复此逻辑,查看所有Line2s连接线阵列,并选择另一条连接线,但它刚刚来自的线除外,即不是Line1。简而言之,我想知道一组线是否完成了一个“电路”,即最后一行==第一行so

伪代码:

Line1->Line1Array->Line2->Line2Array->Line3->Line3Array->Line4->Line4Array->Line1->停止

视觉表现:

我通过硬编码这个我在下面展示的特殊的视觉表现,成功地让它工作。问题是,一个电路可能并不总是由4条边组成,而且这个解决方案似乎不是特别健壮和优雅。如果我有一个方法可以遍历X个数组,并简单地返回是否检测到电路,那就太好了。我遇到过使用递归的情况,但对如何将其应用于这个特定问题感到困惑

实际代码:

更新代码:

嗨@dasblinkenlight谢谢你的回答,这很有用。我觉得我很快就要解决这个问题了,但还是遇到了一个问题。以下是迄今为止的代码注意:我最初按照指令传递一个空数组:

-(bool) findCircuit:(NSMutableArray*) circuit {

for(Line* l in [self getConnectedTo]) {

// ensure line isn't in circuit found so far
if(![circuit containsObject: self]) {
    // add connected line to end of circuit
    [circuit addObject: l];
    // call find circuit on the latest connected line
    if([l findCircuit: circuit])
    return YES;
} else {
    [circuit removeLastObject];
    continue;
}}}
我仍然对后面的部分感到困惑,即何时返回是/否以及这两者之间的关系。我可以通过输出测线ID看到,当有3条测线时,测线按预期拖网通过。以下是包含3行的流程:

Line1->Line2->Line1->Line2->line3->Line2

不幸的是,当链接4行时,程序运行速度非常慢。我可以看到创建了许多线程,但我得到了以下循环:


Line1->Line2->Line1->Line4->Line3->Line4->Line1

递归是正确方向上的一步。正确应用它的诀窍是认为您一次只处理一行,并假装您的递归方法已经完成。当您完成时,该方法将完成,因此您的代码将正常工作。这听起来有点像魔术

首先,将此方法添加到Line类:

电路阵列将包含到目前为止您已找到的线路列表;调用方将向函数传递一个初始为空的NSMutableArray。Line对象本身将提供您需要尝试的连接线。在连接的线路上会有一个回路。在每次迭代中,您的代码将

检查连接的线路是否不在目前发现的电路上 如果不是,则将连接的线路添加到电路的末端,并在其上调用findCircuit。这就是神奇发生的地方:你还没有写完你的方法,但是你可以调用它! 如果findCircuit返回YES,则函数也会返回YES 如果返回“否”,则循环将删除添加到回路中的最后一行,并继续下一行 一旦循环中的所有连接线都用完而不返回YES,该方法将向其调用者返回NO。
就这样,真的!在要从中创建回路的行上调用此方法,将空NSMutableArray传递给它,然后查看该方法是否返回YES。如果是,则传递的数组将包含您的电路。

递归是正确方向上的一步。正确应用它的诀窍是认为您一次只处理一行,并假装您的递归方法已经完成。当您完成时,该方法将完成,因此您的代码将正常工作。这听起来有点像魔术

首先,将此方法添加到Line类:

电路阵列将包含到目前为止您已找到的线路列表;调用方将向函数传递一个初始为空的NSMutableArray。Line对象本身将提供您需要尝试的连接线。在连接的线路上会有一个回路。在每次迭代中,您的代码将

检查连接的线路是否不在目前发现的电路上 如果不是,则将连接的线路添加到电路的末端,并在其上调用findCircuit。这就是神奇发生的地方:你还没有写完你的方法,但是你可以调用它! 如果findCircuit返回YES,则函数也会返回YES 如果返回“否”,则循环将删除添加到回路中的最后一行,并继续下一行 一旦循环中的所有连接线都用完而不返回YES,该方法将向其调用者返回NO。 就这样,真的!在要从中创建回路的行上调用此方法,将空NSMutableArray传递给它,然后查看
如果该方法返回YES。如果是,您传递的数组将包含您的电路。

谢谢您的回答。我已经用我目前的进展更新了这个问题。我在建立电路检测方面仍然有问题。好像我在某个地方有一个递归循环,当4行被链接时,因为我可以看到创建的线程数量是恒定的。@cbros2008您缺少一个返回NO;在你的方法的最后。谢谢你的回答。我已经用我目前的进展更新了这个问题。我在建立电路检测方面仍然有问题。好像我在某个地方有一个递归循环,当4行被链接时,因为我可以看到创建的线程数量是恒定的。@cbros2008您缺少一个返回NO;在方法的末尾。
-(bool) findCircuit:(NSMutableArray*) circuit {

for(Line* l in [self getConnectedTo]) {

// ensure line isn't in circuit found so far
if(![circuit containsObject: self]) {
    // add connected line to end of circuit
    [circuit addObject: l];
    // call find circuit on the latest connected line
    if([l findCircuit: circuit])
    return YES;
} else {
    [circuit removeLastObject];
    continue;
}}}
-(BOOL)findCircuit:(NSMutableArray*)circuit {
    ...
}