问题标签 [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.
loops - Lua 尾调用 vs 循环
我正在用 Lua 编写一个小 CLI 模块以嵌入到 C 程序中。
我想知道处理提示的最佳方法是什么,在tail-call和loop之间进行选择。
作为尾声,我会做这样的事情:
我会问以下问题:
是否正确使用/实现了尾调用消除?是否会
call[cmd] ()
在堆栈中引入任何干扰,以便我不会利用尾调用消除?使用如下循环会更好吗?如果是,为什么?
/li>在 Lua 编程中说明
tail call是一个装扮成呼叫的 goto。
那么尾调用和循环之间有什么具体区别吗?
谢谢你。
go - Go 中的尾调用优化
到目前为止,Go 编程语言是否优化了尾调用?如果不是,它是否至少优化了函数对自身的尾递归调用?
c - 确保 C 中的尾调用优化
可能重复:
哪些 C++ 编译器(如果有)进行尾递归优化?
我正在为类似 Lisp 的语言编写一个小型运行时以用于教育目的,但我想确保 C 代码经过尾调用优化,因为我在我的语言中依赖它。是否有任何编译器可以保证尾调用递归得到优化?如果是这样,是否有关于导致递归优化的规则的文档?
显然,gcc 或 clang 会很好,但我需要确保代码得到适当的优化,因为它取决于它。
haskell - Haskell 有尾递归优化吗?
我今天在 unix 中发现了“时间”命令,并认为我会用它来检查 Haskell 中尾递归和普通递归函数之间的运行时差异。
我写了以下函数:
这些是有效的,请记住它们仅用于该项目,因此我没有费心检查零或负数。
但是,在为每个方法编写主方法、编译它们并使用“time”命令运行它们后,两者都具有相似的运行时,正常递归函数将尾递归函数边缘化。这与我听到的关于 lisp 中的尾递归优化的说法相反。这是什么原因?
c++ - C++11 是否优化了 lambda 中的尾递归调用?
正如以下测试代码所观察到的,我的暂定答案是否定的:
有没有办法强制编译器优化 lambdas 中的递归尾调用?
在此先感谢您的帮助。
编辑
我只是想澄清一下,我的意思是问 C++11 是否优化了 lambdas 中的递归尾调用。我正在使用 Visual Studio 2012,但如果绝对知道 GCC 进行了所需的优化,我可以切换环境。
lisp - 尾递归函数将元素附加到列表
我见过几个append
将元素实现到列表的示例,但都没有使用尾递归。如何以功能风格实现这样的功能?
lua - lua中的尾调用优化
Lua声称它正确实现了尾调用,因此每次调用都不需要维护堆栈,因此允许无限递归,我尝试编写一个求和函数,一个不是尾调用,一个是尾调用:
非尾随版本
stackoverflow 符合预期。
尾声版
我想在这种情况下不会有stackoverflow,因为它是一个尾调用,但由于stackoverflow它仍然失败:
那么是lua真的支持尾调用优化吗,还是我这里的函数其实没有尾调用呢?
我在 redhat 5 上使用 lua 5.1.4
c - Arduino 是否支持尾调用消除?
我想知道标准的 Arduino 环境是否支持尾调用消除……有人知道吗?
optimization - 尾调用优化是针对性能/cpu 还是只节省内存?
当代码进行尾调用优化时,它在性能/复杂性方面是否更优越,相对于未优化的代码消耗更少的 CPU 资源,还是仅节省内存而没有别的?
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
%p
h()
g()