Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   глубина рекурсии (http://www.flasher.ru/forum/showthread.php?t=95264)

chingachgoog 02.05.2007 12:39

глубина рекурсии
 
Насколько я знаю глубина ограничена 256 вызовами.
Однако сделав некий код, я обнаружил, что у меня (по крайней мере в флеш-проигрывателе флеш-редактора (8) что счет переваливает за 300.
:eek:

Код:

// -этот кусок стоит первой строкой в самой рекурсивной функции
рекурсия=function(параметры) {
  zz++
  ................
}


//этот кусок вызывает функцию:
zz=0
рекурсия(параметры)
trace(zz)


BigDan 02.05.2007 13:07

выложи нормальную функцию, в этой нечерта не понятно.

chingachgoog 02.05.2007 13:21

Что тут непонятного?
В рекурсивной функции стоит увеличитель счетчика zz
перед вызовом функции он сбрасывается на ноль, после вызова выводиться в output.

Причем тот же код в классике с факториалом явно не позволяет делать рекурсию длиннее 256 вызовов!
Код:

function factorial(n) {
        zz++
if (n == 0) {
return 1;
} else {
return n*factorial(n-1);
}
}
zz=0
trace(factorial(255));
trace(zz)

У меня же рекурсия ищет с нужной точки мувик с уникальным именем.
И выходит что делает она это иногда даже 303 раза!
Код:

f_find=function(fName, fPath){ // Рекурсия
        zz++
        for (i in fPath) {
                if (fPath[i]._name==fName) {
                        f_N= fPath[i]
                        return f_N
                } else {
                        f_find(fName, fPath[i])
                }
        }
        return f_N       
}

Где fName - имя искомого мувика, например "myMovie", fPath- путь с которого начинается поиск, например _root.mc1.mc2, а f_N - путь к найденному мувику.

Причем если расширить зону поиска, т.е. в начальную точку поска вбить не _root.mc1.mc2, а скажем _root.mc1 или просто _root, то предупреждение о переполнении стека в 256 все же следует!

WindWalker 02.05.2007 14:12

То, что функция вызвалась 303 раза ещё не означает, что была она достигла такой же глубины рекурсии.
Из-за цикла:
Код:

for (i in fPath)
на одной глубине она вызывается несколько раз.


Вот простой пример:
Код:

function go(n) {
        zz++;
        if (n == 0) {
                return;
        }       
        for (var i=0; i<5; i++) {
                go(n-1);
        }
}

zz = 0;
go(5);
trace (zz);

Результат: 3906
Хотя максимальная глубина вызовов: 6.

chingachgoog 02.05.2007 14:44

Круто!
А как же тогда подсчитать именно достигнутую глубину рекурсии?

whiteRed 02.05.2007 14:48

Код:

function rec(level:Number){
trace(level);
if(bla) rec(level+1);
}


WindWalker 02.05.2007 14:49

Например, можно сделать zz параметром.

Код:

max_recurse_depth = 0;

function func(..., zz) {
    if (zz > max_recurse_depth) max_recurse_depth = zz;
    ... // тут какие-то действия
    func(..., zz+1);
    ... // тут ещё какие-то действия
}

zz (..., 0);
trace (max_recurse_depth);

как вариант, можно оставить zz глобальной переменной, но перед вызовом увеличивать на 1, а после вызова - уменьшать.

chingachgoog 02.05.2007 14:58

Да, спасибо, такой вариант все правильно показывает
Код:

function go(n, level) {
        trace(level);
        xlevel=level
        zz++;
        if (n == 0) {
                return;
        }       
        for (var i=0; i<5; i++) {
                go(n-1, level+1);
        }
}

zz = 0;
go(5,1);
trace (zz+" "+xlevel);



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

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