【发布时间】:2011-07-16 15:40:28
【问题描述】:
我最近学习了 Haskell,并且尽可能将纯函数式风格带到我的其他代码中。这方面的一个重要方面是将所有变量视为不可变的,即常量。为了做到这一点,许多将使用命令式循环实现的计算必须使用递归来执行,由于为每个函数调用分配新的堆栈帧,这通常会导致内存损失。然而,在尾调用的特殊情况下(被调用函数的返回值立即返回给被调用者的调用者),这种惩罚可以被称为尾调用优化的过程绕过(在一种方法中,这可以通过基本上在正确设置堆栈后用 jmp 替换调用)。 MATLAB 是否默认执行 TCO,还是有办法告诉它执行?
【问题讨论】:
-
仅仅为了它而避免迭代并不是一个好主意。使用更适合给定问题的任何东西(并且可行 - 当然迭代在纯函数式语言中是不实用的)。
-
通过适当的尾调用优化,“避免迭代”成为您如何看待问题的问题,而不是您的解决方案如何执行。如果 MATLAB 不提供 TCO,那么显然我会在需要时使用迭代,但如果提供了,我将能够在我的所有代码中使用一致的范例。
-
我不了解任何 MATLAB,我说的是一般情况。如果您正在编写 Python 代码,并且 Python 具有 TCO,那么您仍然不应该在循环上使用递归,因为它不是惯用的,语言和 stdlib 专注于充分利用迭代器等。关于“一致范式”:每个范式有其弱点,因此请使用最能解决给定问题的任何方法(当然,“最佳”的定义还包括它与其他问题的协同程度)。
-
MATLAB 中的 Y-Combinator:mathforum.org/kb/message.jspa?messageID=6636833&tstart=0
标签: matlab functional-programming tail-recursion tail-call-optimization