![]() |
|
||||||||||
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
DarkLight, ты не путаешь глубину рекурсии с настройками таймаута в CS4?
|
|
|||||
|
aksios, программу создаю, там реализовать рекурсией гораздо проще, чем циклами (как по мне, может и ошибаюсь). И вообще чем так плоха рекурсия?
Вот к примеру. Мне нужно обработать переменную в цикле относительно нескольких величин, т.е. по логике я должен создать цикл в цикле (а то и несколько ступеней вложенности) - флеш при этом однозначно повесится (возможно не на долго, но факт перегрузки есть), а в случае с использованием рекурсии все это решается более спокойно (хотя по времени может и дольше, но без подвисания компа). Вот и возникает вопрос: когда лучше рекурсия, а когда цикл? Кстати, в моем примере достаточно сложная система обработки переменных, поэтому выбрал рекурсию (хотя наверное можно было бы попробовать и циклом). Кстати о ресурсах - я частично уже написал, а если говорить о вышеуказанном коде, так там хоть 5000 итераций - субъективно будет практически без задержек.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
|
ветеран форума
|
Цитата:
__________________
4am is time to rock |
|
|||||
|
Лучше тогда, когда это красивее выглядит, и более важно - быстрее бегает.
Кстати, а почему при рекурсии компьютер повеситься, а при циклах будет бегать быстрее? Цитата:
Хотя, циклы пожалуй выйграют, ибо область поиска переменных у них будет более ближняя (они будут локальны) и будут быстрее обращаться, чем к функции, которая не локальна. Хотя, можно сделать на неё ссылку, но не факт, что поможет. Надо на досуге проверить)
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Psycho Tiger и уважаемая публика...
Предлагаю 2 варианта кода, по сути делающих одно и то же: вывод мувика из библиотеки на основную сцену. В библиотеке мувик (просто квадрат) с Linkage "quad". Код с применением цикла: Stage.align = "TL"; Stage.scaleMode = "noscale"; for (v=0; v<100; v++) { for (h=0; h<100; h++) { this.attachMovie("quad","quad_v"+v+"h"+h,this.getNextHighestDepth()); this["quad_v"+v+"h"+h]._x = this["quad_v"+v+"h"+h]._width*v; this["quad_v"+v+"h"+h]._y = this["quad_v"+v+"h"+h]._height*h; } } Код с применением рекурсии (и задержки для обхода лимита ее глубину) Stage.align = "TL"; Stage.scaleMode = "noscale"; foo(0,0,this); function foo(v, h, targ) { targ.attachMovie("quad","quad_v"+v+"h"+h,targ.getNextHighestDepth()); targ["quad_v"+v+"h"+h]._x = targ["quad_v"+v+"h"+h]._width*h; targ["quad_v"+v+"h"+h]._y = targ["quad_v"+v+"h"+h]._height*v; if (h<100) { foo(v,h+1,targ); } else { if (v<100) { setTimeout(foo,1,v+1,0,this); } else { trace("stop"); } } } Исходя из вышесказанного остановлюсь все же на рекурсии (т.к. не думаю что пользователь будет рад полному подвисанию системы, даже в ущерб скорости). Если у кого будут другие мнения и/или доводы - с удовольствием выслушаю.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
С тем же успехом можно было прогонять пачками циклы с интервалом, не забивая память рекурсиями.
|
|
|||||
|
Т.е. получается любая функция хранится в памяти до окончания работы ролика , а рекурсия плодит их (функции) похлеще кроликов? Если да, то можно ли (и как) удалить рекурсивную функцию из памяти?
Upd. Перепроверил - при рекурсии функция пересоздается (по крайней мере таковы результаты трэйса), так что не понятно чем тогда будет забиваться память. Если можно - поподробней по данной теме.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! Последний раз редактировалось TanaTiX; 30.06.2009 в 00:48. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Память забивается стеком вызовов и локальными переменными, из значениями и областями видимости, очевидно же.
|
|
|||||
|
Всем спасибо за внимание, все понятно.
Upd. Вот стало интересно с Flasm-ом немного поиграться, интересно ж... Наваял такой незатейливый код: foo(0,200); function foo(s, e) { this.txt.text += s+", ";//txt - InstanceName вручную созданного текстового поля if (s<e) { foo(s+1,e); } } В результате получаю такой код: movie 'rec.swf' compressed // flash 9, total frames: 1, frame rate: 12 fps, 550x400 px
frame 0
constants 'txt', 'text', ', ', 'foo'
function2 foo (r:2='s', r:3='e') (r:1='this')
push r:this, 'txt'
getMember
push 'text', r:this, 'txt'
getMember
push 'text'
getMember
push r:s, ', '
add
add
setMember
push r:s, r:e
lessThan
not
branchIfTrue label1
push r:e, r:s, 1
add
push 2, 'foo'
callFunction
pop
label1:
end // of function foo
push 200, 0.0, 2, 'foo'
callFunction
pop
end // of frame 0
end
ЗЫ. и я так понимаю, что под ас3 прога работать не будет?
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
|
Цитата:
__________________
Тут мужик танцует и поёт про флэш |
![]() |
![]() |
Часовой пояс GMT +4, время: 18:53. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|