Кажется, рекурсивный метод в Java просто «переходит» на первую строку метода, вместо того, чтобы фактически перейти к следующему вызову. - PullRequest
2 голосов
/ 12 июля 2010

Я создаю фабрику, которая производит комнаты, и ей передают int шагов и стартовую комнату, и она должна сделать шаг, построить комнату, а затем назвать себя с одним меньшим шагом и новой комнатой, какСтартовая комната.Проблема в том, что это никогда не заканчивается.В отладчике я вижу, что он вызывает сам себя, что создает в памяти еще один вызов метода, который на самом деле имеет на один шаг меньше, но затем строка выполнения переходит к началу вызова метода current !поэтому он никогда не завершает новый вызов.Как будто он помещал новый вызов в кучу, а не в стек, а затем никогда не получал его.

Код:

@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);
}

В приведенном выше коде он проходит через различные реализации, затем переходит к новому вызову place (), а затем просто создает новый экземпляр place (), но не не входит в него, а вместо этого строка выполнения возвращается к «Комната комнаты».= start_room "исходного вызова.Он делает это бесконечно, причем циклы всегда имеют начальное значение 4, и все больше и больше экземпляров place () заполняют стек.Я посмотрел на новые экземпляры, и все они на самом деле имеют значение «циклов» 3.

Странно то, что каждая итерация, которая на самом деле выполняется, запускается в следующей комнате, поэтому, когда она идетобратно наверх, он возвращается наверх, минуя следующую комнату.Но почему он создает новый экземпляр place () (с новой комнатой AND и новым значением циклов 3), а затем повторно запускает старый place (), используя новую комнату, НО НЕ новое значение циклов 3?

Ответы [ 2 ]

6 голосов
/ 12 июля 2010

Вы используете cycles--, shop-- для уменьшения переменных.Однако, хотя x-- уменьшает x, он не возвращает уменьшенное значение.Возвращаемое значение выражения x-- является старым значением x.Используйте x-1 вместо x--.(Или --x, если необходимо, но здесь нет смысла изменять переменную).

1 голос
/ 12 июля 2010

попробуйте заменить эту строку:

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

с этой строкой:

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

Может быть, вы можете найти дополнительную помощь здесь

...