Javascript で必要なものの例として、C で書かれたこの単純な迷路ソルバー プログラムを使用します。
int is_free_place(int x,int y) {
char ch[2];
if(x<1||x>80||y<1||y>20)
return 0;
gettext(x,y,x,y,ch);
return ch[0]==32; // X or space
}
int solve(int x, int y, int x_end,int y_end) {
int ans=0;
if(kbhit()) efn();
gotoxy(x,y);
putchar('.');
delay(DELAY_TIME);
if(x==x_end&&y==y_end)
return 1;
if(is_free_place(x-1,y))
ans=solve(x-1,y,x_end,y_end); //// <<<<< recursion starts here
if(ans==0&&is_free_place(x+1,y)) //// can't continue to here if using setTimeout
ans=solve(x+1,y,x_end,y_end); //// because ans is not set
if(ans==0&&is_free_place(x,y-1))
ans=solve(x,y-1,x_end,y_end);
if(ans==0&&is_free_place(x,y+1))
ans=solve(x,y+1,x_end,y_end);
if(ans==0){
gotoxy(x,y);
putchar(' ');
delay(DELAY_TIME);
}
return ans;
}
void main(){
clrscr();
efn(); // reads maze from file, shows menu, calls solve()
}
私はjavascriptで同様の再帰を行おうとしていますが、コードが完了するまでブラウザがフリーズし、一時停止して変更するオプションを備えた進行状況の遅いアニメーションが必要です。だから私は setTimeout を使用しようとしましたが、関数が「戻り」、コードが再帰呼び出しから続行するときのアルゴリズムを理解できません... (setTimeout はすぐに続行し、関数の戻りを待ちません)
[更新]スタックを使用せずにyieldを使用してこれを行う方法はありますか?