我试图在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];
}
}
然而,这不起作用,我得到堆栈溢出。你能看出我做错了吗?
提前致谢!
答案 0 :(得分:0)
这是由递归过多引起的。尝试迭代解决方案。
澄清:每个函数调用使用一些堆栈空间来传递参数和/或保存将在被调用函数范围内更改的CPU寄存器的状态。如果你正在进行非常深的递归,你最终可能会使用所有堆栈空间,因此崩溃。
迭代解决方案通过用动态大小的数组或队列替换系统堆栈来避免此问题。这使用系统内存而不是堆栈空间。
(基本上是一个递归解决方案,您在函数中使用队列或数组来代替通过递归函数调用获得的自动簿记)
另一种选择可能是广度优先递归与深度优先。