0

我正在尝试在 Objective-C 中生成一个迷宫。我已经构建了一个图并连接了所有边(我认为)。但是,我在尝试制作真正的迷宫时遇到了困难。

这是我正在使用的代码:

- (void)visitFromCurrentPoint:(GridPoint *)point fromPreviousVertex:(Vertex *)prev {

if ([grid allVerticiesVisited]) {
    NSLog(@"done!");
    return;
}
Vertex *cur = [grid vertexAtPoint:point];
[grid setVertextVisited:cur];
NSArray *borderingVerticies = [grid verticiesBorderingPoint:point];
Vertex *randomVertex;
int random = arc4random()%[borderingVerticies count];
randomVertex = [borderingVerticies objectAtIndex:random];
if (![randomVertex visited]) {
    [cur.edgeList removeObject:prev];
    [prev.edgeList removeObject:cur];
    [self visitFromCurrentPoint:[randomVertex point] fromPreviousVertex:cur];
}
else {
     [self visitFromCurrentPoint:point fromPreviousVertex:cur];
}
}

但是,这不起作用,我得到堆栈溢出。你能看出我做错了什么吗?

提前致谢!

4

1 回答 1

0

这是由于递归过多造成的。尝试迭代解决方案。

澄清一下:每个函数调用都使用一些堆栈空间来传递参数和/或保存将在被调用函数范围内更改的 CPU 寄存器的状态。如果你正在做真正的深度递归,你最终可能会使用所有的堆栈空间,从而导致崩溃。

迭代解决方案通过将系统堆栈替换为动态大小的数组或队列来避免该问题。这使用系统内存而不是堆栈空间。

(基本上是一种递归解决方案,您在函数中使用队列或数组来代替通过递归函数调用获得的自动簿记)

另一种选择可能是广度优先递归与深度优先。

于 2012-08-03T19:30:16.470 回答