【问题标题】:The benefits of tail-recursion [duplicate]尾递归的好处
【发布时间】:2013-12-17 06:17:04
【问题描述】:

如果我猜对了,smart 编译器会检测尾递归函数并将其转换为迭代函数。

除了以函数式编写的好处(不变性、函数独立性等)之外,尾递归还有哪些其他好处?我是否应该考虑尽可能(在 C# 中)编写迭代解决方案?

【问题讨论】:

标签: c# recursion functional-programming tail-recursion


【解决方案1】:

根据我的经验,我会优先考虑“性能”的可读性。从我们不得不考虑将数字向右或向左移动而不是乘以或除以 2 的时代,我们已经走了很长一段路。

话虽如此,回到 Uni 我们不得不递归地解决 Eight queen puzzle。完成后,我想我真的可以在任何电路板尺寸上运行它。如果我没记错的话,我认为递归方法会在 11x11 板上崩溃(双关语)。因为我也有一个迭代解决方案(它们实际上非常等效),所以我决定运行那个,并且可以轻松解决更大的电路板而没有问题。

您可以进行基准测试,直到您满意为止,并争论到您的手指在键盘上流血为止,但最终通常都无关紧要。如果您的解决方案有效,请使用它。如果您认为您可能会遇到内存问题,因为递归会在堆栈上不断分配新内存,请使用迭代。在任何一种情况下,拥有可读的代码都会更好地为您服务:)

【讨论】:

  • 我同意你的观点,尾递归函数更具可读性,但到目前为止,我还没有遇到过性能问题。使用递归的问题。我想那我会坚持一段时间。 . . !
  • :)。试一试好老皇后的问题……也许使用今天的硬件,您将能够使用更大的电路板,但最终您会遇到限制。然后你可以看到迭代的好处。但在大多数情况下,相同但不同。
  • 初学者程序员通常需要一些习惯递归才能阅读。尾递归也是如此。当你看过和写过一些时,我认为它的可读性没有什么不同。
  • 初学者程序员通常也需要一些习惯迭代!当我上大学时,第一门编程课程实际上是用 Haskell 教授的,所以在我们学习 for 循环之前自然就出现了递归。我不认为这让学习编程从根本上变得更难(或更容易),它只是意味着我们更早地熟悉了不同的概念。
  • :) 我们使用了 java、c++、c、lisp 和汇编程序。在执行高级 OO 与 CPU 将值推送到寄存器后让我发疯......我想如果反过来,我会因为失去你从较低级别获得的控制而发疯 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 2016-03-21
  • 2018-03-17
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多