PDA

Просмотр полной версии : глубина рекурсии


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