问题标签 [tail-call]
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.
lua - 是否可以在 lua 中对河内塔进行适当的尾声?
我用递归制作了一个河内塔问题的代码,并在在线lua编译器上运行它。如果我将输入超过 14,它就不会运行。
我认为这可以通过适当的尾调用来解决,但据我所知,正确的尾调用必须返回相同的函数。但在该代码中,递归中有两个“hanoi”函数。
那么这是 lua 中正确的尾调用吗?
有没有办法对河内问题进行适当的尾声?
tail-recursion - 在尾调用中,编程语言如何知道函数调用的结果是什么?
我的问题标题可以改进,如果我要谈论的内容有一个具体的名称,请告诉我。
这也不适用于特定语言,我使用的所有语言都将函数调用视为表达式。
所以我一直在阅读递归和尾调用,所以我用 C++ 编写了这段代码
当然test(num)
总是会评估0
if num > 0
,因为基本情况是n = 0
。
但为什么?语言如何知道应该返回什么?它如何知道test(n - 1)
应该评估什么?
编辑;
我已经包含了一种获取数字阶乘的递归方法。C++(或任何语言)如何知道乘以num
什么?
perl - 如何重构 for 循环中发生的递归以使其成为尾调用?
考虑递归子程序append_until_exhausted
。递归发生在主体的中间。我想把它放在最后进行进一步处理,也就是说一个简单的尾调用(没有任何优化,在 Perl 中通常涉及 a goto
)。除了子例程和两个辅助子例程的签名之外,您可以更改任何内容。
涉及数字的算法看起来很愚蠢,因为它们是我真实代码的浓缩/混淆,但是子程序调用的代码执行路径/结构没有改变。
这里的目标是让我理解这个原理,以便我可以在类似的情况和类似的语言中应用它。如果您建议一些 {Sub::*, B::*, XS} 魔法,这将无济于事。
scala - 有没有办法在 Scala 中优化尾调用?
我知道 Scala 对尾递归函数进行了优化(即递归调用是函数执行的最后一件事的那些函数)。我在这里要问的是是否有办法优化对不同函数的尾调用。考虑以下Scala
代码:
如果我们让它执行足够长的时间,它会产生一个堆栈溢出错误,可以通过分配更多的堆栈空间来缓解这个错误。尽管如此,它最终会超出分配的空间,并再次导致堆栈溢出错误。减轻这种情况的一种方法可能是:
然而,这被证明是相当缓慢的。有没有更好的方法来优化这个?
assembly - 尾调用栈
我无法理解以汇编语言实现 Tail 调用所需的堆栈操作。
当我们对函数进行 Tail 调用时,我们基本上想用被调用函数的 Activation Frame 覆盖当前的 Activation Frame。
我无法理解完成激活帧切换所需的过程。
RSP 如何更改以便位于正确的地址以及如何保持原始调用函数的 RBP 不发生更改?