Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 02.05.2007, 12:39
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 1  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
По умолчанию глубина рекурсии

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


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


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


Последний раз редактировалось chingachgoog; 02.05.2007 в 13:18.
Старый 02.05.2007, 13:07
BigDan вне форума Посмотреть профиль Отправить личное сообщение для BigDan Найти все сообщения от BigDan
  № 2  
Ответить с цитированием
BigDan
 
Аватар для BigDan

Регистрация: Apr 2006
Адрес: Kiev
Сообщений: 1,675
Отправить сообщение для BigDan с помощью ICQ
выложи нормальную функцию, в этой нечерта не понятно.

Старый 02.05.2007, 13:21
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 3  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Что тут непонятного?
В рекурсивной функции стоит увеличитель счетчика 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 все же следует!


Последний раз редактировалось chingachgoog; 02.05.2007 в 13:56.
Старый 02.05.2007, 14:12
WindWalker вне форума Посмотреть профиль Отправить личное сообщение для WindWalker Найти все сообщения от WindWalker
  № 4  
Ответить с цитированием
WindWalker
[+1 18.03.08]

Регистрация: Nov 2006
Сообщений: 223
То, что функция вызвалась 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.


Последний раз редактировалось WindWalker; 02.05.2007 в 14:23.
Старый 02.05.2007, 14:44
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 5  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Круто!
А как же тогда подсчитать именно достигнутую глубину рекурсии?

Старый 02.05.2007, 14:48
whiteRed вне форума Посмотреть профиль Отправить личное сообщение для whiteRed Найти все сообщения от whiteRed
  № 6  
Ответить с цитированием
whiteRed
 
Аватар для whiteRed

Регистрация: Nov 2004
Сообщений: 187
Отправить сообщение для whiteRed с помощью ICQ
Код:
function rec(level:Number){
trace(level);
if(bla) rec(level+1);
}
__________________
С моих слов записано верно. Мною прочитано.

Старый 02.05.2007, 14:49
WindWalker вне форума Посмотреть профиль Отправить личное сообщение для WindWalker Найти все сообщения от WindWalker
  № 7  
Ответить с цитированием
WindWalker
[+1 18.03.08]

Регистрация: Nov 2006
Сообщений: 223
Например, можно сделать 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, а после вызова - уменьшать.

Старый 02.05.2007, 14:58
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 8  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Да, спасибо, такой вариант все правильно показывает
Код:
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, время: 16:05.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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