问题标签 [infinite-recursion]

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 投票
1 回答
272 浏览

parsing - 使用递归下降解析器解析算术表达式的无限递归

我正在尝试在 python 中创建自己的递归下降解析器,但是当我的解析器遇到有关算术表达式的规则时,它超过了 python 递归限制。这是语法:

语法中的花括号表示它们可以重复(但也是可选的),并且在我的解析器中使用 while 循环来实现。我觉得造成这种情况的原因是Grouping规则可以是 and (它可以一遍又一遍地重复,因为and规则Expression的右侧是可选的)。FactorTerm

我要问的是:有没有办法用递归下降解析器实现左递归或以某种方式在我的语法中消除它?

编辑:我在四处浏览,似乎这种类型的递归称为间接左递归,也许这与它有关?

0 投票
3 回答
3065 浏览

java - 如何防止无限递归循环

我似乎无法想出解决递归问题的方法。所以我有这个 Version 对象,它包含对它所依赖的其他版本对象的引用列表。

版本

当我检索这个对象时,我还必须检索它的依赖项以及依赖项的依赖项,直到最终结束,这看起来像这样

版本Dto

这是我检索版本的递归函数

但是,在版本可能是嵌套依赖项之一的依赖项的情况下,我遇到了可能的无限循环问题,例如 v1 -> v2 -> v4 -> v1 导致无限重复。

知道如何解决和防止这种无限循环,因此如果版本都准备好更早发生,它应该跳过它?

编辑:使用全局列表的解决方案

0 投票
1 回答
109 浏览

r - R Shiny 错误与 rbind 编译循环结果:错误评估嵌套太深:无限递归

我尝试编译从数据帧中的循环获得的结果,使用 rbind 将每次迭代的结果添加到数据帧(这里,这是一个简化的示例)。该代码在 R 中没有问题,但在 R 中,它会导致无限递归问题:

“错误:评估嵌套太深:无限递归/选项(表达式=)?”

我尝试了几种解决方案并在论坛中进行了搜索,但无法找到完全相同的问题。如果有人可以帮助我,那就太好了!

谢谢 !

0 投票
2 回答
137 浏览

python - 使用 dict.get() 方法在 python 代码中进行阶乘的无限递归

我写了一个 Python 函数来计算一个数字的阶乘,就像这样;

我惊讶地发现它会导致无限递归,即使对于fact(0). 然后我添加了一个断言,就像这样;

但是这一次 AssertionError 被提出,意思n变成了否定的。我不明白这一点。我在网上查到了这个。但是,不幸的是找不到任何答案。请有人可以向我解释这里发生了什么?

0 投票
3 回答
57 浏览

python - Python:具有类继承的 RecursionError

我给了一个A带有方法fg. 在 的实现中A.f,方法self.g被调用,即被A.g使用。(我不能/不愿意改变这个类A,因为它来自一个 python 包。)

现在我想建立一个子类BA想要覆盖方法fg. 在 的实现中B.f,我调用了super().fie A.f。在 的实现中B.g.,我调用了self.fie B.f

我希望一切都定义明确: B.g调用B.f调用A.f调用A.g

事实上,RecursionError当我遇到无限数量的递归时,我得到了一个: B.g调用B.f调用A.f调用B.g

我不正确理解什么?

这是一个实现:

澄清一下:在我的应用程序中,A是一个 scikit-learn 类,fisfitgis fit_transform。在这个 scikit-learn 类中,fit_transform被显式覆盖,fit不幸的是使用fit_transform. 为了确保我的子类B不继承fit_transformA,我必须以通常的方式重新定义它,这会导致如解释的那样无限递归。

0 投票
2 回答
51 浏览

c++ - 在迭代模板类型列表时无法停止递归

所以我有一个这样的模板类型列表:

我做了一个这样的访问器函数:

具有if_else_t<>以下实现:

现在,如果我使用以下命令测试该功能:

我触发了检查 ElementIndex 是否大于列表大小的 static_assert。从编译器的输出中,我可以清楚地看到at<>永远不会停止递归,直到 ElementIndex 达到他的数值限制(ElementIndex = 0 - 1 的情况)并且触发了 static_assert。

我究竟做错了什么 ?

理想的答案还应该包括更好、更优雅的实现at<>:)

请注意,我使用的是 MSVC 和 C++17。

0 投票
1 回答
84 浏览

c++ - 缺少用户定义的 to_string() 的编译时检测

我想为to_string(obj)我创建的每个对象类型提供一个函数。我找到了这个问题,应用了接受的答案,并且它有效。到目前为止,一切都很好。

然后我创建了一个新类型,但忘记to_string()为它写一个(或者更好:我不小心让它无法被 ADL 访问)。问题是:我的程序仍然编译得很好,并且在运行时我得到一个模糊的堆栈溢出(TM)。

有没有办法获得合理的错误信息呢?

notstd::to_string()这是一个演示问题的小程序:和之间的无限递归notstd::adl_helper::as_string()

我尝试创建一个接受另一个参数的包装函数,用于执行反递归检查,如下所示:

这里的问题是:

  • 我必须包装所有std::to_string() 重载
  • 我只会得到一个运行时错误,但我觉得这个问题可以而且应该被检测到广告编译时间
  • 我可能会增加一些开销,只在开发期间有用:也许我可以添加一些宏来在发布模式下停用所有这些,但它会增加更多工作

也许我可以使用模板来std::to_string()为我的类型包装和创建特化......这将是一个完全不同的野兽,但如果合适的特化不可用,至少它会提供编译时错误。我将再次包装所有std::to_string()重载,并且我可能不得不(几乎)忘记 ADL,至少在所有编译器都支持 c++20 之前,如果我理解得很好的话。

有没有人有更好的解决方案?

谢谢!

0 投票
1 回答
65 浏览

matlab - 内存不足错误 MATLAB:lang:StackOverflow

我正在开发一个未经编译就可以正常工作的 Matlab 应用程序,但是当我编译它并尝试运行可执行文件时,出现此错误:

记不清。可能的原因是程序内的无限递归。集合中的错误(第 15 行)MATLAB:lang:StackOverflow

...这是无益的,因为它没有说明哪个函数属于无限递归。有没有办法找到递归发生的时间?

0 投票
0 回答
66 浏览

python - 无限递归和 sys.setrecursionlimit 停止脚本没有任何错误

我想通过测量运行时做一些小实验,特别是比较斐波那契的三种实现:递归、lru_cache 和线性(线性空间)。我不小心以一种创建无限递归的方式实现了 lru_ache 版本:

(基本上我是想先复用递归版本,后来发现它不会对递归调用应用缓存,所以改成这个)

这导致我的程序只是简单地停止而没有任何错误或消息。如果从 IDLE 启动,它会创建RESTART: Shell行并返回到 REPL

lru_cache 的文档页面上,我没有发现停止脚本的提及。

这是预期的行为,还是可能的错误?

编辑:

我已经通过 sys.set 将递归限制设置为 500_000。但是,我仍然希望有一个例外。它的文件

这应该小心完成,因为过高的限制会导致崩溃。

但并不是说我不会收到任何消息。然而,情况可能就是这样。

0 投票
1 回答
176 浏览

recursion - 递归可以有无限循环吗?

我听到人们说很多时候递归可以是一个“无限循环”,但那句话不是只适用于用循环完成的事情吗?对这样的递归说“无限循环”是否有效和正确?说“无限递归”不是更好吗?