问题标签 [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.

0 投票
1 回答
102 浏览

lua - 是否可以在 lua 中对河内塔进行适当的尾声?

我用递归制作了一个河内塔问题的代码,并在在线lua编译器上运行它。如果我将输入超过 14,它就不会运行。

我认为这可以通过适当的尾调用来解决,但据我所知,正确的尾调用必须返回相同的函数。但在该代码中,递归中有两个“hanoi”函数。


那么这是 lua 中正确的尾调用吗?


有没有办法对河内问题进行适当的尾声?

0 投票
0 回答
18 浏览

tail-recursion - 在尾调用中,编程语言如何知道函数调用的结果是什么?

我的问题标题可以改进,如果我要谈论的内容有一个具体的名称,请告诉我。

这也不适用于特定语言,我使用的所有语言都将函数调用视为表达式。

所以我一直在阅读递归和尾调用,所以我用 C++ 编写了这段代码

当然test(num)总是会评估0if num > 0,因为基本情况是n = 0

但为什么?语言如何知道应该返回什么?它如何知道test(n - 1)应该评估什么?

编辑;

我已经包含了一种获取数字阶乘的递归方法。C++(或任何语言)如何知道乘以num什么?

0 投票
2 回答
114 浏览

perl - 如何重构 for 循环中发生的递归以使其成为尾调用?

考虑递归子程序append_until_exhausted。递归发生在主体的中间。我想把它放在最后进行进一步处理,也就是说一个简单的尾调用(没有任何优化,在 Perl 中通常涉及 a goto)。除了子例程和两个辅助子例程的签名之外,您可以更改任何内容。

涉及数字的算法看起来很愚蠢,因为它们是我真实代码的浓缩/混淆,但是子程序调用的代码执行路径/结构没有改变。

这里的目标是让我理解这个原理,以便我可以在类似的情况和类似的语言中应用它。如果您建议一些 {Sub::*, B::*, XS} 魔法,这将无济于事。

0 投票
1 回答
125 浏览

scala - 有没有办法在 Scala 中优化尾调用?

我知道 Scala 对尾递归函数进行了优化(即递归调用是函数执行的最后一件事的那些函数)。我在这里要问的是是否有办法优化对不同函数的尾调用。考虑以下Scala代码:

如果我们让它执行足够长的时间,它会产生一个堆栈溢出错误,可以通过分配更多的堆栈空间来缓解这个错误。尽管如此,它最终会超出分配的空间,并再次导致堆栈溢出错误。减轻这种情况的一种方法可能是:

然而,这被证明是相当缓慢的。有没有更好的方法来优化这个?

0 投票
1 回答
80 浏览

function - 是否在 Rust 中优化了对不同函数的尾调用?

如果我有以下功能:

Rust 是否优化了对简单跳转的此类调用?

我查看了一个Playground展示程序集,但a似乎只是功能。callqb

总是这样吗?

0 投票
1 回答
33 浏览

assembly - 尾调用栈

我无法理解以汇编语言实现 Tail 调用所需的堆栈操作。

当我们对函数进行 Tail 调用时,我们基本上想用被调用函数的 Activation Frame 覆盖当前的 Activation Frame。

我无法理解完成激活帧切换所需的过程。

RSP 如何更改以便位于正确的地址以及如何保持原始调用函数的 RBP 不发生更改?