我正在创建一个制作房间的工厂,并且它传递了一个int步骤和一个启动空间,应该做一步,建立一个房间,然后用更少的步骤和新的房间作为起始房间。问题是它永远不会结束。在调试器中,我可以看到它正在调用它自己,它在内存中创建另一个方法调用,实际上只有一个步骤,但执行线会跳到方法调用的最前面!所以它永远不会完成新的呼叫。就好像它将新的调用放入堆栈而不是堆栈中,然后再也没有真正做到。Java中的递归方法似乎只是“转到”方法的第一行,而不是实际进入下一个调用
代码:
@Override
public Room place(Level level, int cycles, Room start_room,
Direction direction, int shop, int exit, LevelFactoryReport report) throws Exception
{
Room room = null;
if(cycles < 1)
{
return start_room;
}
else
{
report.addEvent("--Placer step--");
report.addEvent("Steps remaining: "+cycles);
room = this.Step(level, start_room, direction, shop, exit, report);
if(room == null)
{
cycles = 0;
report.addEvent("Step returned a null room (probably because it ran into an existing room). Ending cycle.");
}
}
return place(level, (cycles--), room, direction, (shop--), (exit--), report);
}
在上面的代码,它通过各种实现,然后获取到新的呼吁地方(),然后它只是创造的地方()一个新的实例,但不会进入它,而是执行线返回到原始调用的“Room room = start_room”。它可以无限地执行这个操作,循环总是处于初始值4,并且越来越多的place()填充堆栈。我研究了新的实例,实际上它们的“周期”值为3.
奇怪的是,实际运行的每个迭代正在下一个房间运行,因此当它返回到顶部,它将回到通过隔壁房间的顶部。但为什么它会创建place()的新实例(使用新房间和新周期值3),然后使用新房间重新运行旧地点()而不是新周期值3?
哦男人。像这样的事情可能非常明显,同时也是隐形的!发生了什么事情是,我认为的这些电话是记忆中的新电话实际上是旧电话的旧电话,而旧电话的值减少了一个,而我认为是一次又一次呼叫的旧电话是实际上堆栈中的* new *调用被传递给新房间,而且还传递了从(cycles--)返回的值,正如你告诉我的,返回值(周期)。 非常感谢。 – ColdSnickersBar 2010-07-11 21:33:04