forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Рекурсия в MP (http://forum.boolean.name/showthread.php?t=13780)

AleD 25.11.2010 05:09

Рекурсия в MP
 
Привет boolean.name! Решил посмсотреть MP и для теста начал писать сапёра, проблема вот в чём. Когда открываешь клетку, а там пусто, то, как и в MS Сапёре, открываются все смежные клетки, для этого использовал рекурсивную функцию:
Код:

procedure OpenEmpty(x, y: Integer);
begin
  if(x>=0)and(y>=0)and(x<=8)and(y<=8)and(space[x,y].tp=S_EMPTY)and(space[x,y].hidden>0)then
  begin
    space[x,y].hidden := 0;
    OpenEmpty(x, y-1);
    OpenEmpty(x-1, y);
    OpenEmpty(x, y+1);
    OpenEmpty(x+1, y);
  end;
end;

Но процедура просто зависает :( вроде бы есть 2 ограничения - размер поля и клетки только со свойством hidden>0.
Код:

=====Thread[Thread-4,1,main]=====
M.think(I)V
  M.openfield(II)V
    M.openempty(II)V
      M.openempty(II)V
        M.openempty(II)V
          M.openempty(II)V
            M.openempty(II)V

MP вообще поддерживает рекурсивные функции?

ViNT 25.11.2010 12:32

Ответ: Рекурсия в MP
 
Вообще поддерживает, но не уверен, что алгоритм работает корректно, когда функция вызывается внутри себя несколько раз подряд.

cherepets 25.11.2010 12:43

Ответ: Рекурсия в MP
 
Проблем быть не должно. У меня в последней игре процедура нанесения урона, натыкаясь на бочку, вызывает себя же еще 9 раз. К зависанию не приводит.

AleD 25.11.2010 19:06

Ответ: Рекурсия в MP
 
Нашёл в чём проблема была. MP проверяет сразу все условия в if'ах, что впринципе не нужно, если уже есть хотя бы одно true
Код:

if(false)or(false)or(true)or({это выражение уже можно и не вычислять}false)or(false)then ...


Часовой пояс GMT +4, время: 10:22.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot