Col*_*Bar 2 java recursion tail-recursion
我正在创建一个制作房间的工厂,它通过一个步骤和一个开始房间,它应该做一个步骤,建立一个房间,然后用一个较少的步骤和新房间作为开始房间自行呼叫.问题是它永远不会结束.在调试器中,我可以看到它正在调用自身,这会在内存中创建另一个实际上只有一个步骤的方法调用,但是执行行将转到当前方法调用的顶部!所以它永远不会真正完成新的通话.好像它将新调用放入堆而不是堆栈,然后实际上从未实现过.
码:
@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);
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,它通过各种实现,然后进入place()的新调用,然后它只是创建一个place()的新实例,但不会进入它,而是执行行去回到原始电话的"Room room = start_room".它无限地执行此操作,循环始终处于其初始值4,并且越来越多的place()填充堆栈.我查看了新实例,并且它们实际上都具有3的"周期"值.
奇怪的是,实际运行的每个迭代都在下一个房间运行,所以当它返回到顶部时,它会回到通过下一个房间的顶部.但是为什么它会创建一个新的place()实例(新房间和新周期值为3),然后使用新房间重新运行旧地方()而不是新的周期值3?
你正在使用cycles--,shop--减少变量.但是,x--虽然递减x,但它不返回递减的值.表达式的返回值x--是旧值x.用x-1而不是x--.(或者,--x如果你必须,但在这里改变变量是没有意义的).