【问题标题】:Is there an obvious way to confirm if a function is tail recursive?有没有一种明显的方法来确认一个函数是否是尾递归的?
【发布时间】:2013-11-08 15:39:20
【问题描述】:

有什么方法可以判断 F# 中的函数是否是尾递归的?

我试图解释它,但有些人似乎很挣扎,并询问是否有办法确认他们所做的是尾递归。您可以做些什么简单的事情(除了试图让它溢出堆栈)来确认尾部响应(或不)(最好在 IDE 中)?

(我尝试过 Reflector,但是当我打开 F# 项目时它就崩溃了!)

【问题讨论】:

  • 你可以试试其他的反编译器,现在已经很多了。
  • 我尝试了 JetBrains,但它也崩溃了(在我的机器上安装了一堆废话,比如控制面板!)
  • 我想我的问题是“为什么”?如果有人在他们的代码中看到堆栈溢出,那么他们会想要确保他们有 TCO,但这应该是相当明显的。否则,这听起来有点过早的优化。
  • 我只是想帮助教它;对事物不熟悉的人通常想检查他们是否做对了;这不是关于优化特定案例,而是在需要时了解如何去做:-)

标签: .net f# functional-programming tail-recursion


【解决方案1】:

来自here(文章中有几个例子):

如何验证是否正在使用尾调用?

确保使用尾调用的最简单方法是理解并应用上一节中的规则。虽然 F# 编译器本身目前不提供任何方法来验证是否已在特定调用站点使用尾调用,但您可以通过使用 MSIL Dissasembler (ildasm.exe) 查看代码的编译版本来确定。我们将在下面看到几个示例。

【讨论】:

  • 比我希望的稍微复杂一些;可能更容易理解规则;(
  • 注意:在引用的文章中,Keith 说“我的下一篇文章将介绍如何解决本文中提到的一些限制。”虽然第一篇文章不错,但我仍在等待后续。见:stackoverflow.com/a/9694718/1243762
猜你喜欢
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2021-06-27
相关资源
最近更新 更多