问题标签 [tail-recursion]

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 投票
3 回答
552 浏览

performance - 为什么scalac在某些场景下不能优化尾递归?

为什么scalac(Scala编译器)不优化尾递归?

演示这一点的代码和编译器调用:

0 投票
2 回答
2015 浏览

scala - Scala和尾递归

Stack Overflow 上有各种答案,解释了在Scala中可以进行尾递归的条件。我了解限制以及如何以及在何处可以利用尾递归。我不明白的部分是为什么存在对私有或最终方法的限制。

我还没有研究过 Scala 编译器实际上是如何在字节码级别将递归函数转换为非递归函数的,但让我们假设它执行以下操作。我有一个Foo带有递归函数的类mod

这是一个基本的模函数,我想 Scala 编译器会转换为某种伪 Java-Scala,例如:

(我可以相信我把翻译搞砸了,但我认为细节并不重要..)

所以现在假设我是子类Foo

是什么阻止了它的工作?当JVM有aFoo/Bar并且mod在上面调用的时候,为什么解析mod应该使用的函数会出现问题。为什么这与基函数非递归的情况有什么不同?

我认为出现这种情况的几个可能原因是:

  1. 无论出于何种原因,Scala 编译器的实现都无法处理这个问题(如果是这样的话,那就足够了。如果是这样,是否有计划改变这个?)

  2. in函数Foo在编译期间被修改,因此实际上没有方法可以覆盖。modmod-non-recursiveFoomod

0 投票
5 回答
4372 浏览

f# - F#中的while或尾递归,什么时候使用?

好的,仅在 F# 中,这就是我现在的理解:

  • 有些问题本质上是递归的(构建或读出树结构仅举一个例子),然后您使用递归。在这些情况下,您最好使用尾递归来中断堆栈

  • 有些语言是纯函数式的,所以你必须使用递归而不是 while 循环,即使问题本质上不是递归的

所以我的问题是:既然 F# 也支持命令式范式,你会在 F# 中使用尾递归来解决那些不是自然递归的问题吗?特别是因为我已经阅读了编译器 recongnizes tail recursion 并且只是在 while 循环中转换它?

如果是这样:为什么?

0 投票
5 回答
8073 浏览

functional-programming - 有没有用尾递归写不出来的问题?

尾递归是函数式语言中重要的性能优化策略,因为它允许递归调用消耗常量堆栈(而不是 O(n))。

是否有任何问题根本无法以尾递归风格编写,或者是否总是可以将天真递归函数转换为尾递归函数?

如果是这样,有朝一日,函数式编译器和解释器可能会变得足够智能以自动执行转换吗?

0 投票
1 回答
653 浏览

clojure - Clojure中的尾调用消除?

有人可以将此(plt)Scheme 代码重写为 Clojure 吗?

以不将过程 f、g 和 h 折叠在一起并允许代码无限期运行而不会崩溃的方式?

0 投票
4 回答
406 浏览

f# - 避免 F# 中的代码重复

我有两个代码片段试图将浮点列表转换为 Vector3 或 Vector2 列表。这个想法是一次从列表中取出 2/3 个元素并将它们组合为一个向量。最终结果是一系列向量。

代码看起来非常相似,但似乎没有办法提取公共部分。有任何想法吗?

0 投票
8 回答
3258 浏览

optimization - 函数式编程中的高效递归与不同范式中的低效递归

据我所知,递归在 OOP 和过程编程中非常优雅但效率低下(参见精彩的“High Order perl”,Mark Jason Dominus)。我有一些信息表明,在函数式编程中,递归很快——保持其优雅和简单。有人可以确认并可能放大这一点吗?我正在考虑 XSLT 和 Haskell(在我的下一门语言学习列表中排名靠前)

谢谢

丹尼尔

0 投票
2 回答
1012 浏览

ocaml - 这个函数是否使用尾递归?

我想知道 oCaml 是否将此代码优化为尾递归,如果是,F# 是否如此?

0 投票
2 回答
495 浏览

c - 递归调和函数返回 NaN

我编写了以下示例代码来查找 N. (1+1/2+1/3+...1/N) 的谐波值。阅读用 BOLD 编写的代码中的注释,帮助我找出为什么会发生这种情况。

谢谢,纳迦

0 投票
3 回答
2767 浏览

c++ - Visual C++ 尾调用优化

根据对该问题的回答: 如果有的话,哪些 C++ 编译器会进行尾递归优化? 看来,编译器应该进行尾递归优化。

但是我已经尝试过建议的选项,并且在模板函数的情况下编译器似乎无法进行这种优化。它可以以某种方式修复吗?