问题标签 [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.
garbage-collection - 具有并发垃圾收集器的功能语言?
Microsoft 的新 F# 编程语言提供了函数式编程(一流的词法闭包和尾调用)与高效的并发垃圾收集器的强大组合,可以轻松利用多核。
OCaml、Haskell、Erlang 以及我所知道的所有免费 Lisp 和 Scheme 实现都没有并发 GC。Scala 和 Clojure 有一个并发 GC,但没有尾调用。
因此,似乎没有结合这些功能的开源编程语言。那是对的吗?
java - Java和C#中的尾调用?
我正在阅读有关 Clojure 的内容,发现在当前版本中 Java 不支持尾调用的讨论,并且人们正在抛出异常来模拟 JVM 中的尾调用,无论如何听起来人们正在做一些疯狂的事情。所以这让我想知道 C# 的尾调用,同样的问题?
c++ - Visual C++ 尾调用优化
根据对该问题的回答: 如果有的话,哪些 C++ 编译器会进行尾递归优化? 看来,编译器应该进行尾递归优化。
但是我已经尝试过建议的选项,并且在模板函数的情况下编译器似乎无法进行这种优化。它可以以某种方式修复吗?
c++ - 如何在自定义 VM 中实现尾调用
如何在自定义虚拟机中实现尾调用?
我知道我需要弹出原始函数的本地堆栈,然后是参数,然后推送新参数。但是,如果我弹出函数的本地堆栈,我应该如何推送新参数?他们刚刚从堆栈中弹出。
algorithm - 如何识别什么是尾递归,什么不是尾递归?
有时它很简单(如果 self 调用是最后一个语句,它就是尾递归),但仍有一些情况让我感到困惑。一位教授告诉我“如果在自调用之后没有执行指令,那就是尾递归”。这些例子怎么样(忽略它们没有多大意义的事实):
a)这个应该是尾递归的,看看自调用是最后一个语句,并且在它之后没有任何东西可以执行。
b) 但是这个呢?它应该是一个尾调用,因为如果条件为真,除了它之外什么都不会被执行,但它不是最后一个语句?
c) 这个怎么样?在这两种情况下,self 调用都是最后执行的:
c# - 引发异常时返回堆栈跟踪时如何进行 C# 尾递归优化
我看到了一些关于 C# 中缺少尾调用优化的问题,据说这使得该语言不适合递归算法实现。然而,这引出了一个问题,我们如何进行尾调用优化,并且在引发异常或可以使用反射来检查调用堆栈并对其采取行动时仍然提供合理的堆栈跟踪。
f# - F# 中的不可变 Trie 结构
我正在使用 aho-corasick 算法来尝试使用 F# 做得更好一些,但我遇到了 Trie 实现的问题,它们都是可变的或者不能进行尾调用优化。
我所看到的基本问题是,必须“自下而上”构建不可变数据结构,因为您无法更改它们指向的内容,因此您的选择是使它们可变,或者在进行过程中找出节点(即构造中的递归)。
有什么方法可以在构造上通过尾调用优化来制作不可变的 trie 数据结构?(并且不会因复制而降低效率。)
tail-recursion - 实例方法中的 CIL (MSIL) 尾调用递归
背景:我正在为一个学校项目编写一个 .NET 编译器(非常类似于 C#)。我目前尝试添加的功能之一是方法内的尾调用递归。
更多信息:在 CIL 中,“this”被传递给实例方法,就好像它只是另一个参数一样。因此,访问静态方法的第一个参数,您将发出 ldarg.0,但访问实例方法的第一个参数,您将发出 ldarg.1,而在实例方法中访问“this”,您将发出 ldarg.0 . (实例方法比我想象的更类似于扩展方法。)
问题:您可以使用starg.0 设置“this”而没有任何副作用吗?
为什么这是有问题的:方法是否是实例方法是通过 MethodBuilder 设置的,这有点像一个黑盒子。尽管“this”看起来就像任何其他参数一样,但据我所知,一些 JIT 编译器会单独跟踪“this”并根据该值更改它们的行为。如果在实例方法中设置“this”时有副作用,那么我该如何避免它们呢?
c - Arduino 是否支持尾调用消除?
我想知道标准的 Arduino 环境是否支持尾调用消除……有人知道吗?
f# - 执行时这将是尾调用吗?
一旦编译并运行,这会表现为尾调用吗?
也许有一种简单的方法可以测试我不知道的行为,但这可能是另一个问题。