问题标签 [infinite-loop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
2206 浏览

java - 为什么Java toString() 在间接循环上无限循环?

这更像是一个我想分享的问题而不是一个问题:当使用 打印时toString(),Java 将检测 Collection 中的直接循环(Collection 引用自身),但不会检测间接循环(Collection 引用另一个 Collection 引用第一个 - 或更多步骤)。

这对我来说是一个真正的问题,因为它发生在调试代码以打印出 Collection 时(当它捕捉到一个直接循环时我很惊讶,所以我错误地假设他们已经实现了一般的检查)。有一个问题:为什么?

我能想到的解释是,检查引用自身的集合非常便宜,因为您只需要存储集合(您已经拥有),但是对于更长的周期,您需要存储所有集合相遇,从根源开始。此外,您可能无法确定根是什么因此您必须将每个集合存储在系统中 - 无论如何您都会这样做 - 但您还必须对每个集合元素进行哈希查找. 对于相对罕见的循环情况(在大多数编程中),这是非常昂贵的。(我认为)它检查直接循环的唯一原因是因为它非常便宜(一个参考比较)。

好的......我已经回答了我自己的问题 - 但我错过了什么重要的事情吗?有人想添加什么吗?


澄清:我现在意识到我看到的问题是特定于打印集合(即toString()方法)。循环本身没有问题(我自己使用它们并且需要拥有它们);问题是Java无法打印它们。编辑Andrzej Doyle 指出它不仅仅是集合,而是任何toString被调用的对象。

鉴于它受限于此方法,这里有一个算法来检查它:

  • 根是调用第一个对象的对象toString()(要确定这一点,您需要维护 toString 当前是否正在进行的状态;所以这很不方便)。
    • 当您遍历每个对象时,您将其添加到 IdentityHashMap 以及唯一标识符(例如递增索引)。
    • 但是如果这个对象已经在 Map 中,写出它的标识符。

这种方法还可以正确渲染多引用(一个被多次引用的节点)。

内存成本是 IdentityHashMap(每个对象一个引用和索引);复杂性成本是有向图中每个节点(即打印的每个对象)的哈希查找。

0 投票
5 回答
6265 浏览

c# - C# WinForms:在无限循环中等待按钮按下

我正在用 GUI 制作一个简单的猜数字游戏。我需要等待一个循环,等待用户在文本框中输入一个数字,然后按“确定”。如何等待循环内的事件?

注意:我不想要消息框。这是在主窗口中完成的,因此需要等待输入。

编辑:我应该更好地解释自己。我知道 GUI 中有一个循环。我想要的是方法中的另一个循环。也许有更好的方法来做到这一点。现在我想了想,我可以在按钮的事件处理程序中编写代码。虽然我需要全局变量。Whataver,我会考虑一下,但我希望我的问题现在更清楚了。

编辑2:对不起,我的问题不清楚,编辑并没有太大帮助。首先,代码太大,这里就不贴了。我可能不得不发布 GUI 的屏幕截图,所以它不会有太大用处。基本上,我有两个字段,“最大数量”和“允许猜测的数量”。用户输入这两个并点击“播放”。一个新面板变为可用,带有一个文本框和一个“猜测”按钮。用户输入一个猜测,程序检查它是否正确。

第二个无限循环的目的是避免全局变量。看,每次用户点击“玩”,游戏必须生成一个新的随机数作为正确的猜测。如果一切都在一个方法内完成,那没问题。但是如果多次调用“Guess”按钮的事件处理程序,则该数字必须存储为 Form 的实例变量。当然,这没什么大不了的,但我认为数字应该是指导当前游戏的方法的属性,而不是 Form 的属性。

我还必须跟踪方法之外的剩余猜测次数。再说一次,这没什么大不了的。如果可以的话,我只想避免使用全局变量。

再次,我很抱歉我的问题不太清楚。有点累,不想写太多。如果这仍然不清楚,请不要打扰。我会想办法的。

0 投票
11 回答
17767 浏览

java - 如何检测递归调用中的无限循环?

我有一个递归调用自身的函数,如果进入无限循环,我想检测并终止,即 - 再次因同样的问题被调用。最简单的方法是什么?

编辑:这是函数,它将以不同的 x 和 y 值递归调用。如果在递归调用中,我想终止对 (x,y) 的值重复。

0 投票
3 回答
6979 浏览

iphone - 在 iPhone 上制作带有无限循环的弹跳球动画的最佳方法是什么?

我正在开发一款让鸟类弹跳的 iPhone 游戏。

我已经设置了像这样为飞鸟的翅膀设置动画的图像:

现在我如何让鸟移动是使用 NSTimer 每 0.03 秒触发一次,它从 imgBird[i].center 的 x 或 y 坐标中加/减 1。

我从这里学会了这样做。http://icodeblog.com/2008/10/28/iphone-programming-tutorial-animating-a-ball-using-an-nstimer/

但问题是,一旦另一个计时器(用于以相同方式移动我的船)触发并在我停止移动船时返回原始速度,鸟儿就会减速。

除了 NSTimer 之外,有没有更好的方法让鸟儿保持移动?

鸟的运动是一个无限循环。

0 投票
6 回答
6461 浏览

php - 循环 PHP 脚本

我有一个 PHP 脚本,它检查一个目录并删除任何未在 15 秒内修改的文件(这是为了游戏)。

我的问题是如何让这个脚本一直运行。我设置了一个 cron 作业以每 10 分钟运行一次,然后在 PHP 脚本中我有一个无限循环和 sleep(10)。我的想法是它会每 10 秒运行一次代码,并且在脚本停止的情况下,cron 作业最终会重新启动它。

但是,脚本启动后,它会运行大约 3 个循环(30 秒)然后停止。我听说 PHP 每次文件加载只能获得这么多的内存。

如何让这个 PHP 脚本无限循环?也许有某种方式可以称自己为

0 投票
5 回答
12131 浏览

php - 如何调试和防止 PHP 中的无限循环?

我最近遇到了一个挑战我编程能力的问题,这是一个非常偶然的无限循环。我重写了一些代码来干掉它,并更改了一个被它调用的确切方法重复调用的函数;一个基本的问题,当然。Apache 决定通过崩溃来解决问题,日志只记录了“生成的子进程”。问题是我那天没有真正调试完这个问题,它在下午突然出现,今天不得不解决它。

最后,我的解决方案很简单:手动记录逻辑,看看发生了什么。当我有一个由两行独特的日志文件组成的日志文件时,问题立即显现出来,然后是两行,每行重复大约 200 次。

有哪些方法可以保护自己免受无限循环?而且,当它失败时(它会失败),追踪它的最快方法是什么?确实是最有效的日志文件,还是其他?

如果这是最佳实践,您的答案可能与语言无关,但我宁愿坚持使用 PHP 特定的技术和代码。

0 投票
7 回答
36523 浏览

php - php for循环有2个变量?

是否有可能做到这一点?(这是我的代码)

我想要这样的东西:

变量 0 是 10

变量 1 是 9

变量 2 是 8 ...

但是我的代码是错误的,它给出了一个巨大的列表。PHP大师,帮助我!

0 投票
5 回答
1097 浏览

c# - 如何替换无限循环?

我正在编写一些效率相当低的 C# 代码,这些代码想要删除空白行。它这样做:

单个替换无法处理输入中的(例如)\n\n\n,因此需要循环。我认为它应该起作用,而且通常会起作用。

但有时它会设法进入无限循环,我不明白如何。在每次迭代中,\n 的数量都应该减少,所以它应该最终终止。

有任何想法吗?

0 投票
4 回答
4259 浏览

.net - 如何避免 .NET RegEx 类中的无限循环?

有一个简单的任务来获取 XPath 表达式并返回与(可能)选择的节点的父节点匹配的前缀。

例子:

因为方括号内的模式可能包含引号内的括号,所以我决定尝试使用正则表达式来实现这一点。这是一个代码片段:

因为模式相当规则,所以我查找了 '/' 后跟标识符,后跟一个匹配字符串末尾的可选组 (....)?$

代码似乎可以工作,但是使用不同的输入字符串值,我发现通过简单地插入一个空格(在注释中显示的位置),.NET IsMatch 函数进入一个无限循环,占用它获得的所有 CPU .

现在,不管这个正则表达式模式是否是最好的模式(我有更复杂但简化它以显示问题),这似乎表明使用 RegEx 与任何不平凡的事情可能是非常冒险的。

我错过了什么吗?有没有办法防止正则表达式匹配中的无限循环?

0 投票
2 回答
433 浏览

vb.net - VB.NET 中的 TCP 冻结

我在 VB .Net 中制作了一个使用 tcp 并来回发送消息的游戏。

发生的情况是,每隔一段时间,消息就不能足够快地发送,因此该TCPObj.connect()方法进入一个循环,直到它达到超时,然后吐出一个错误。但大多数时候,它永远不会出错,我的应用程序只是冻结,然后在TCPObj.connect()成功后返回。如何在connect()尝试连接时使该方法执行 application.doevents ?基本上,我不希望它冻结我的整个应用程序。由于tcp.connect()是 .NET 方法,我无法进去添加application.doevents.