0

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を使用してこれを行う方法はありますか?

4

4 に答える 4

1

setTimeout一度だけ実行します。戻り値はタイムアウトそのものです。

var timeout = setTimeout(function () { console.log( "hi" ) }, 1000);
// timeout == some id

clearTimeoutこれにより、メソッドでタイムアウトをクリアすることを選択した場合に、タイムアウトをクリアできます。

再帰setTimeoutループを使用してゲーム ループを作成できます。

setTimeout(function call() {
     // Do code
     //...     
     setTimeout( call, 1000 / 60 ); // loop
}, 1000 / 60 ) // 60 fps
于 2012-05-18T23:53:17.100 に答える
1

特に、書かれているように、再帰呼び出しの結果を取得する必要があるため、これを setTimeout で使用できるものとして書くのは少し難しいでしょう。このようなものを処理する最も簡単な方法は、dojo や jQuery のようなある種の promise インフラストラクチャを使用する (または自分で作成する) ことだと思います。もっと詳しく説明したいのですが、現時点ではこれ以上の作業はできません。1 つのヒント: jQuery のpipeメソッドは、ここで驚異的な効果を発揮すると思います。

頭に浮かぶ他のオプションは、 ans 変数と、おそらく現在の関数呼び出しのどの部分に戻る必要があるかを示す何かを保存するスタックを使用するように書き直すことです。

于 2012-05-19T01:53:11.667 に答える
0

setTimeout使用方法と を使用してクリアする方法の JavaScript の例を次に示しますclearTimeout

<html>
<head>
<script type="text/javascript">
var c=0;
var t;
var timer_is_on=0;

function timedCount()
  {
  document.getElementById('txt').value=c;
  c=c+1;
  t=setTimeout("timedCount()",1000);
  }

function doTimer()
  {
  if (!timer_is_on)
    {
    timer_is_on=1;
    timedCount();
    }
  }

function stopCount()
  {
  clearTimeout(t);
  timer_is_on=0;
  }
</script>
</head>
<body>

<form>
<input type="button" value="Start count!" onclick="doTimer()" />
<input type="text" id="txt" />
<input type="button" value="Stop count!" onclick="stopCount()" />
</form>

</body>
</html>

ここから取られます。

于 2012-05-18T23:55:36.800 に答える
-1

私は setInterval が仕事をすると思います: setInterval

  var int = setInterval(clock,1000);

  function clock()
  {
     var d=new Date();
     var t=d.toLocaleTimeString();
     document.getElementById("clock").value=t;
  }
于 2012-05-19T01:46:27.557 に答える