- ループによる幅優先探索

以前再帰による幅優先探索を紹介したが、
迷路が巨大になると、
スタックオーバーフローの問題に突き当たる。

再帰が駄目なんじゃなく、お前の再帰関数が駄目なんだよ、
とか言うけど、無視して、
この場合、再帰を使用して幅優先探索を実装することは、
向いていないと言わせてください。

解決策として、再帰では無く、
do whileのループを使用する方法が考えられる。

ただ、ループの上限を設定しない場合、
その他のプログラムの実行速度や描画に影響を及ぼす。

下記のようにループに対して、
最大ループ回数を設定し、
タイマーを使うことで、解決できる。

private var currentCount:uint;

private var searchRetryTimer:Timer=new Timer(100,1);

public function search(maxLoopCount:uint=1000){
     do{
       currentCount++;
       if(currentCount>maxLoopCount){
        searchRetryTimer.start();
        return;
       }
       checkGoal();
     }while(!founded);
    
     callBack.apply(scope , [goalInfo]);
}

private function onSearchRetryTimer(evt:Timer):void{
      search();   
}

Trackback : 0 : ループによる幅優先探索

http://www.onmyownlife.com/mt/mt-tb.cgi/42

Comment