问题标签 [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.
algorithm - 什么是尾递归?
在开始学习 lisp 时,我遇到了tail-recursive一词。究竟是什么意思?
c++ - 哪些 C++ 编译器(如果有)进行尾递归优化?
在我看来,在 C 和 C++ 中进行尾递归优化会非常好,但是在调试时,我似乎从来没有看到表明这种优化的帧堆栈。这很好,因为堆栈告诉我递归有多深。但是,优化也会很好。
是否有任何 C++ 编译器进行此优化?为什么?为什么不?
我该如何告诉编译器这样做?
- 对于 MSVC:
/O2
或/Ox
- 对于 GCC:
-O2
或-O3
在某种情况下检查编译器是否已经这样做了如何?
- 对于 MSVC,启用 PDB 输出以能够跟踪代码,然后检查代码
- 对于海湾合作委员会..?
我仍然会就如何确定编译器是否像这样优化某个函数提出建议(尽管我发现康拉德告诉我假设它令人放心)
总是可以通过进行无限递归并检查它是否导致无限循环或堆栈溢出来检查编译器是否完全执行此操作(我使用 GCC 执行此操作并发现这就-O2
足够了),但我想成为能够检查我知道无论如何都会终止的某个功能。我很想有一个简单的方法来检查这个:)
经过一些测试,我发现析构函数破坏了进行这种优化的可能性。有时值得更改某些变量和临时变量的范围,以确保它们在返回语句开始之前超出范围。
如果在尾调用之后需要运行任何析构函数,则无法进行尾调用优化。
java - JVM 会阻止尾调用优化吗?
我在这个问题上看到了这句话:什么是构建 Web 服务的好的函数式语言?
Scala 尤其不支持尾调用消除,除非在自递归函数中,这限制了您可以执行的组合类型(这是 JVM 的基本限制)。
这是真的?如果是这样,那么造成这种基本限制的 JVM 是什么?
algorithm - 什么是尾调用优化?
很简单,什么是尾调用优化?
更具体地说,有哪些小代码片段可以应用,哪些不可以,并解释原因?
haskell - Haskell 尾递归如何工作?
我写了这段代码,我假设len
它是尾递归的,但仍然会发生堆栈溢出。怎么了?
lisp - 计算列表长度的尾部优化函数的最佳方法是什么?
这是一个论坛发帖人给出的一个例子,我不知道这个尾巴是否优化了。另外,有人可以外行描述尾部优化版本如何胜过普通版本。
非尾部优化版本?
gcc - 如何检查 gcc 是否正在执行尾递归优化?
如何判断 gcc(更具体地说,g++)是否正在优化特定函数中的尾递归?(因为它出现了几次:我不想测试 gcc 是否可以优化尾递归。我想知道它是否优化了我的尾递归函数。)
如果您的答案是“查看生成的汇编程序”,我想确切地知道我在寻找什么,以及是否可以编写一个简单的程序来检查汇编程序以查看是否有优化。
PS。我知道这似乎是问题的一部分,如果有的话,C++ 编译器会进行尾递归优化吗?从 5 个月前开始。但是,我认为该问题的这一部分没有得到令人满意的回答。(答案是“检查编译器是否进行了优化(据我所知)的最简单方法是执行一个调用,否则会导致堆栈溢出 - 或查看程序集输出。”)
c# - 为什么 .NET/C# 不针对尾调用递归进行优化?
我发现了这个关于哪些语言优化尾递归的问题。为什么 C# 尽可能不优化尾递归?
对于一个具体案例,为什么不将此方法优化为循环(Visual Studio 2008 32 位,如果重要的话)?:
iphone - 我应该避免在 iPhone 上递归吗?
我应该避免使用在 iPhone 上运行的代码进行递归吗?
或者换一种说法,有人知道 iphone 上的最大堆栈大小吗?
algorithm - 理解递归
我在学校里很难理解递归。每当教授谈论它时,我似乎都明白了,但是当我自己尝试时,它完全让我大吃一惊。
我整晚都在试图解决河内塔问题,完全让我大吃一惊。我的教科书只有大约 30 页的递归,所以它不是太有用。有谁知道可以帮助澄清这个话题的书籍或资源?