Scala递归没有副作用

时间:2013-05-18 13:28:51

标签: scala recursion

好的,我知道所有递归都更具功能性,因为你没有改变迭代中任何对象的状态。但是,在scala中没有什么能阻止你这样做。

  var magoo = 7; 

  def mergeSort(xs: List[Int]): List[Int] = {
    ...
    magoo = magoo + 1
    mergeSort(xs1, xs2);

  }

事实上,你可以像在Java中一样在Scala中进行递归。 那么可以公平地说Scala只是通过使用模式匹配来简化编写简洁的递归吗?就像没有什么能阻止我在Java中编写任何我可以用Scala编写的无状态递归代码吗?

关键是Scala中的复杂递归可以通过更简洁的代码来实现。 就这样。 正确的吗?

3 个答案:

答案 0 :(得分:5)

有一些东西可以阻止你在Java中编写递归代码:尾部调用消除(TCE)。在Java中,可以在深度递归时获取StackOverflowException,而in Scala tail calls will be optimized(在内部表示为循环)。

  

因此,可以说Scala只是简单易懂   使用模式匹配递归?

我认为在Scala中这两个概念是相互正交的。

答案 1 :(得分:4)

如果当然可以在Java中进行复杂的递归。如果你愿意,你可以在汇编程序中进行复杂的递归。但在Scala中,这样做更容易。 此外,Scala还具有尾调用优化功能,如果您希望将任意迭代算法编写为递归方法而不会导致堆栈溢出或性能下降,则非常重要。

答案 2 :(得分:2)

很少有编程语言实际上禁止编写不可变代码。实际上,真正的纯函数式语言可能只是Haskell,甚至Scheme和ML都有一些方法可以使用可变值。所以,功能风格只是鼓励你编写不可变代码。这取决于你自己选择是否改变价值。