2010-07-11 17 views
2

我正在创建一个制作房间的工厂,并且它传递了一个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?

回答

6

您正在使用cycles--,shop--来减少变量。但是,尽管x--的确减少了x,但它不会返回递减的值。表达式x--的返回值是旧值x。使用x-1而不是x--。 (如果你必须的话,或者--x,但是在这里变量变量没有意义)。

+0

哦男人。像这样的事情可能非常明显,同时也是隐形的!发生了什么事情是,我认为的这些电话是记忆中的新电话实际上是旧电话的旧电话,而旧电话的值减少了一个,而我认为是一次又一次呼叫的旧电话是实际上堆栈中的* new *调用被传递给新房间,而且还传递了从(cycles--)返回的值,正如你告诉我的,返回值(周期)。 非常感谢。 – ColdSnickersBar 2010-07-11 21:33:04

1

尝试更换这行:

return place(level, (cycles--), room, direction, (shop--), (exit--), report); 

这一行:

return place(level, (--cycles), room, direction, (--shop), (--exit), report); 

也许你可以找到一些更多的帮助here

相关问题