问题标签 [tail-call-optimization]

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 回答
1260 浏览

loops - Lua 尾调用 vs 循环

我正在用 Lua 编写一个小 CLI 模块以嵌入到 C 程序中。

我想知道处理提示的最佳方法是什么,在tail-callloop之间进行选择。

作为尾声,我会做这样的事情:

我会问以下问题:

  1. 是否正确使用/实现了尾调用消除?是否会call[cmd] ()在堆栈中引入任何干扰,以便我不会利用尾调用消除

  2. 使用如下循环会更好吗?如果是,为什么?

    /li>
  3. 在 Lua 编程中说明

    tail call是一个装扮成呼叫的 goto。

    那么尾调用和循环之间有什么具体区别吗?

谢谢你。

0 投票
3 回答
12273 浏览

go - Go 中的尾调用优化

到目前为止,Go 编程语言是否优化了尾调用?如果不是,它是否至少优化了函数对自身的尾递归调用?

0 投票
0 回答
95 浏览

c - 确保 C 中的尾调用优化

可能重复:
哪些 C++ 编译器(如果有)进行尾递归优化?

我正在为类似 Lisp 的语言编写一个小型运行时以用于教育目的,但我想确保 C 代码经过尾调用优化,因为我在我的语言中依赖它。是否有任何编译器可以保证尾调用递归得到优化?如果是这样,是否有关于导致递归优化的规则的文档?

显然,gcc 或 clang 会很好,但我需要确保代码得到适当的优化,因为它取决于它。

0 投票
4 回答
27391 浏览

haskell - Haskell 有尾递归优化吗?

我今天在 unix 中发现了“时间”命令,并认为我会用它来检查 Haskell 中尾递归和普通递归函数之间的运行时差异。

我写了以下函数:

这些是有效的,请记住它们仅用于该项目,因此我没有费心检查零或负数。

但是,在为每个方法编写主方法、编译它们并使用“time”命令运行它们后,两者都具有相似的运行时,正常递归函数将尾递归函数边缘化。这与我听到的关于 lisp 中的尾递归优化的说法相反。这是什么原因?

0 投票
1 回答
1293 浏览

c++ - C++11 是否优化了 lambda 中的尾递归调用?

正如以下测试代码所观察到的,我的暂定答案是否定的:

有没有办法强制编译器优化 lambdas 中的递归尾调用?

在此先感谢您的帮助。

编辑

我只是想澄清一下,我的意思是问 C++11 是否优化了 lambdas 中的递归尾调用。我正在使用 Visual Studio 2012,但如果绝对知道 GCC 进行了所需的优化,我可以切换环境。

0 投票
5 回答
4845 浏览

lisp - 尾递归函数将元素附加到列表

我见过几个append将元素实现到列表的示例,但都没有使用尾递归。如何以功能风格实现这样的功能?

0 投票
1 回答
3983 浏览

lua - lua中的尾调用优化

Lua声称它正确实现了尾调用,因此每次调用都不需要维护堆栈,因此允许无限递归,我尝试编写一个求和函数,一个不是尾调用,一个是尾调用:

非尾随版本

stackoverflow 符合预期。

尾声版

我想在这种情况下不会有stackoverflow,因为它是一个尾调用,但由于stackoverflow它仍然失败:

那么是lua真的支持尾调用优化吗,还是我这里的函数其实没有尾调用呢?

我在 redhat 5 上使用 lua 5.1.4

0 投票
2 回答
312 浏览

c - Arduino 是否支持尾调用消除?

我想知道标准的 Arduino 环境是否支持尾调用消除……有人知道吗?

0 投票
1 回答
169 浏览

optimization - 尾调用优化是针对性能/cpu 还是只节省内存?

当代码进行尾调用优化时,它在性能/复杂性方面是否更优越,相对于未优化的代码消耗更少的 CPU 资源,还是仅节省内存而没有别的?

0 投票
2 回答
695 浏览

c - 为什么这段代码会阻止 gcc 和 llvm 进行尾调用优化?

我已经在 Linux 上的 gcc 4.4.5 和 Mac OSX(Xcode 4.2.1)上的 gcc-llvm 和这个. 下面是相关函数的源码和生成的反汇编。(补充:用 编译gcc -O2 main.c


我们可以看到g()andh()几乎是相同的,除了(以及不相关的and )&的参数旁边的(地址)运算m符。然而,尾调用优化而不是。为什么?printf()%ld%ph()g()