问题标签 [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 投票
3 回答
2364 浏览

java - 我可以清理堆栈跟踪吗?

我知道我可以使用 Thread.getAllStackTraces() 获取堆栈跟踪(它返回 Map,但 clear 不起作用)。当我运行递归方法时,由于堆栈跟踪太大,我会得到异常,有没有办法清除它?

0 投票
6 回答
1461 浏览

php - 解析文件中的嵌套标签

我想知道-解析以下内容的最有效方法是什么:

当然,这最终是为了成为一个模板系统,所以我的计划是创建一个哈希图来“覆盖”模板,就像这样

值得注意的是,“部分”(以#开头的标签)可以重复多次,我认为这就是让我绊倒的原因......

此外,任何部分都可以包含任意数量的其他部分,以及常规标签......

所以..你是怎么做到的?

0 投票
20 回答
51221 浏览

python - 如何在 Python 中使用递归来反转列表?

我想要一个函数,它将返回它给出的列表的反向 - 使用递归。我怎样才能做到这一点?

0 投票
5 回答
9559 浏览

recursion - 如何使用 Master theorem 来描述递归?

最近一直在研究递归;怎么写,怎么分析等等。我一直认为递归和递归是一回事,但是最近的家庭作业和测验中的一些问题让我觉得有细微的差别,“递归”是一种方法描述递归程序或函数。

直到最近,这对我来说都是非常希腊化的,当我意识到有一种叫做“主定理”的东西用来写问题或程序的“递归”时。我一直在阅读维基百科页面,但是,像往常一样,事情的措辞让我真的不明白它在说什么。我通过例子学得更好。

所以,有几个问题:假设你得到了这个重复:

r(n) = 2*r(n-2) + r(n-1);
r(1) = r(2) = 1

这实际上是主定理的形式吗?如果是这样,用语言来说,它在说什么?如果你想写一个小程序或基于这种递归的递归树,那会是什么样子?我是否应该尝试替换数字,查看模式,然后编写可以递归创建该模式的伪代码,或者,因为这可能是主定理的形式,是否有更直接的数学方法?

现在,假设您被要求为从前一次重复创建的程序执行的加法次数查找重复次数 T(n)。我可以看到基本情况可能是 T(1) = T(2) = 0,但我不确定从那里去哪里。

基本上,我问的是如何从给定的重复到代码,反之亦然。由于这看起来像主定理,我想知道是否有一种直接和数学的方法来解决它。

编辑:好的,我已经查看了我过去的一些作业,以找到另一个我被问到的例子,“寻找复发”,这是这个问题的一部分,我在帖子中遇到了麻烦。

以最佳方式描述以下程序片段中加法运算次数的递归(当使用 l == 1 和 r == n 调用时)

0 投票
5 回答
17389 浏览

perl - 如何递归复制目录并在 Perl 中过滤文件名?

如何复制包含子目录的目录,不包括与 Windows 系统上的某个正则表达式匹配的文件或目录?

0 投票
4 回答
1910 浏览

c# - 总结所有节点

这可能是一个简单的修复 - 但我试图将二叉搜索树上的所有节点(来自 Node 类的 Size 属性)相加。到目前为止,在我的 BST 类下面,我有以下内容,但它返回 0:

在我的 Node 类中,我有 Data ,它将 Size 和 Name 存储在它们的给定属性中。我只是想总结整个大小。有什么建议或想法吗?

0 投票
22 回答
30282 浏览

algorithm - 您将如何编写非递归算法来计算阶乘?

你将如何编写一个非递归算法来计算n!

0 投票
11 回答
7664 浏览

language-agnostic - 你最喜欢的语言如何处理深度递归?

我最近开始学习 Python,我很惊讶地发现深度递归限制为 1000(默认情况下)。如果你将它设置得足够高,大约 30000,它会像 C 一样因分段错误而崩溃。虽然,C 似乎要高得多。

(Python 人员很快指出,您始终可以将递归函数转换为迭代函数,并且它们总是更快。这是 100% 正确的。不过,这并不是我的问题所在。)

我在 Perl 中尝试了相同的实验,大约 1000 万次递归消耗了我所有的 4 gig ram,我使用 ^C 停止尝试。显然 Perl 不使用 C 堆栈,但它在递归时确实使用了大量的内存——考虑到调用函数需要做多少工作,这并不令人震惊。

我在 Pike 中尝试过,在大约 2 秒内获得了 100,000,000 次递归,这让我感到非常惊讶。我不知道它是如何做到的,但我怀疑它会将递归展平为一个迭代过程——它在执行此操作时似乎没有消耗任何额外的内存。[注意:Pike 确实可以使琐碎的情况变平,但在更复杂的情况下会出现段错误,或者我被告知。]

我使用了这些原本无用的功能:

我很好奇其他语言(例如 PHP、Ruby、Java、Lua、Ocaml、Haskell)是如何处理递归的,以及为什么它们以这种方式处理递归。此外,请注意如果函数是“尾递归”(见评论),它是否会有所不同。

0 投票
3 回答
227 浏览

winforms - 路径递归应该发生在类还是表示层中?

我有一个带有输入文本框、按钮和多行输出文本框的 WinForms 应用程序。在文本框中输入根路径。按钮单击调用一个函数来递归检查所有子目录以进行一些正确的目录命名验证检查。结果输出到多行文本框中。

如果递归工作在单独的类中完成,我有两个选择:

  1. 跟踪类属性中不正确的目录(例如 ArrayList),完成后返回 ArrayList,并使用所有结果更新输出文本框。

  2. 传入 ByRef 输出文本框并为每个不正确的目录更新/刷新它。即使 1 和 2 是单线程的,但对于 2,我至少会根据目录更新我的结果。

如果递归工作在表示层完成,验证在单独的类中完成,我可以多线程。

哪种方式更清洁?

0 投票
10 回答
2132 浏览

c# - 使用递归从 IDictionary 中删除项目

有人有更巧妙的方法来做到这一点吗?似乎它应该比这更容易,但我有一个心理障碍。基本上我需要从字典中删除项目并递归到也是字典的项目的值。

动作字典是这样的: