0

我将使用这个用 C 编写的简单的迷宫求解程序,例如我在 javascript 中需要的东西:

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(或自己编写)。我会更详细地介绍,但目前我无法进一步处理。一个提示:我认为 jQuery 的pipe方法会在这里创造奇迹。

想到的其他选择是重写它以使用一个堆栈来保存 ans 变量,并且可能表示您需要返回到当前函数调用的哪一部分。

于 2012-05-19T01:53:11.667 回答
0

这是一个 javascript 示例,如何使用setTimeout以及如何使用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 回答