Нерекурсивными, по-моему =) Все состояние объекта сохраняется в нем же. Я бы назвал это обходом с помощью очереди. Но сама очередь есть распределенная сущность, состоящая из других объектов, сохраняющихся в обходящих. Короче, нам в любом случае нужна
очередь

Код:
some nodes must be deferred – stored in some way for later visiting.
This is often done via a stack (LIFO) or queue (FIFO).
Т.о. само понятие "поиска" в, например, дереве, в глубину, подразумевает сохранение уже обойденных нодов. Чтобы потом воспользоваться ими как отправной точкой для перебора их детей. Но вот где будет храниться эта нода: в глобальном Array или на уровне стека вызовов AVM, в котором сохраняется вновь посещенный объект — это без разницы. Если рекурсия — это сохранение ноды в таких объектах, то я не прав. Если рекурсия — это вызов метода у того же самого объекта, то я прав. Отдельно стоит использование глобального Array. Его использование вообще не попадает под определение рекурсии.
Можно строго подойти к рекурсии: не делай лишних объектов в коллстеке и мы не будем называть твой алгоритм рекурсивным. Не знаю, в общем. Я тоже раньше рекурсию, так же как ты, ассоциировал с вызовами "одинаковых" методов у разных объектов. Но вот задумался немного и пришел в замешательство.
Ах, да. Немного
пруфов не повредит:

Код:
В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно
(простая рекурсия) или через другие функции (сложная или косвенная рекурсия)