再帰関数

http://blog.img8.com/archives/2006/12/002761.html

つい先日自分もひっかかってたのでメモ。
ネストされたXMLデータの処理のため、function内から同じfunctionを呼ぶ(しかも何度も)、みたいな再帰処理書いたら予想外に半端なく重くなってしまって、果てには古MacのFlashplayerで再生したら「スクリプトが原因で処理が遅くなっています」なエラーメッセージまで表示される始末。
多分関数及び関数内でvar宣言されてる変数の分のメモリが解放されないまま次々に関数が呼び出されてメモリ消費していってるんだろうとは予測しつつ。(だから関数内で変数作らなければもう少し軽かったんじゃないかと予測)

まあ、そのときは処理量も半端じゃなかったし、処理内容も結構ヘヴィだったので例外といえば例外的な状況だったわけですが。

で、結局そのときは何をやってしのいだかというと、配列を一つ用意して、関数名と引数をObject型でぶち込んで、enterFrameで「キューにたまってるのを1フレームあたり50こずつ」みたいな感じで処理させるという力技で逃れたわけです。

class Hoge extends MovieClip{
var cueArray:Array;
var processPerFrame:Number=50;
//コンストラクタ
function Hoge(){
cueArray=new Array();
this.onEnterFrame=processCue;
}

//処理
function processCue(){
var count=Math.min(processPerFrame,cueArray.length);
for(var i:Number=0;i>count;i++){
var o:Object=cueArray.shift();
this[o.fnc](o.var0);
}
}

//再帰関数
function saikiKansuu(num:Number){
//処理
//saikiKansuu();←の代わりに
cueArray.push({fnc:"saikiKansuu",var0:num});

}
}

↑こんなイメージ。(今適当に書いたのでこのままだとまともに動かない可能性アリ)