Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Общие вопросы о Flash (не затрагивающие ActionScript) (http://www.flasher.ru/forum/forumdisplay.php?f=60)
-   -   Как понять: "функция вызывает сама себя" (http://www.flasher.ru/forum/showthread.php?t=73974)

jflasher 08.01.2006 17:08

Как понять: "функция вызывает сама себя"
 
Здравствуйте,
Читаю книгу по программированию во flash. Я не могу понять: как функция вызывает сама себя, что в таком случае происходит? Вот пример такой функции (я не прошу разбираться в коде, разберу его конечно же я сам):

function testNeighbor(x,y,c) {
if (_root["block "+x+" "+y]._currentframe == c) {

// remove neighbor
_root["block "+x+" "+y].gotoAndStop(5);
var n = 1;

// test all of these neighbors
n += testNeighbor(x-1,y,c);
n += testNeighbor(x+1,y,c);
n += testNeighbor(x,y-1,c);
n += testNeighbor(x,y+1,c);

// return number of matches found
return(n);

} else {
// no match found
return(0);
}
}

// Из книги Г. Розенцвейга "Flash MX. Создание игр с помощью AS"

Antares 08.01.2006 18:27

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

Судя по примеру ты создаешь игру "жизнь" :) Суть ее в том, что от каждой клетки надо ходить по всем направлениям, проверяя состояние этих клеток. это достигается путем вызова функции "обойти все клетки вокруг" последовательно из текущей функции, пока не встретим границу поля или условие остановки (если честно, я уже плохо помню правила).

Тут надо быть осторожным: более 256 рекурсивных вызовов компилятор Action Script сделать не позволит.

Antares 08.01.2006 18:27

P.S. тэгом [ code ] пользуйся

K.A.T.A.F.A.L.K.E.R 08.01.2006 18:58

это называется рекурсией

Упс... опоздал :( :)

Antares 08.01.2006 19:08

Причем больше, чем на полчаса

K.A.T.A.F.A.L.K.E.R 08.01.2006 19:16

Цитата:

Сообщение от Antares
Причем больше, чем на полчаса

нажал "ответить", потупил, ответил :rolleyes: А можно как-то удалять мессагу в случае такой тупизны? :rolleyes: :D

jflasher 09.01.2006 13:20

Цитата:

Сообщение от Antares
Очень просто: в теле функции происходит вызов ее же при определенном условии. Рекурсия --
...
Судя по примеру ты создаешь игру "жизнь" :)
...

Спасибо за объяснение.

Кстати, 'жизнь' я уже делал, только обошелся без рекурсии. Это был код из игры 'рекурсивные блоки' (создается сетка из разноцветных блоков, при нажатии на блок удаляется и он и его соседи, если они такого же цвета), правда, я не понимал, почему рекурсивные :).


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

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.