Scala递归无副作用

3

好的,我明白了。递归更具有函数式特点,因为在迭代过程中不会改变任何对象的状态。但是,在Scala中也可以做到这一点。

  var magoo = 7; 

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

  }

事实上,在Scala中,您可以像在Java中一样使递归成为无副作用的。因此,可以说Scala通过使用模式匹配使编写简洁的递归更容易吗?就像没有任何阻止我在Java中编写任何无状态递归代码,我可以在Scala中编写。
关键点是,在Scala中,可以使用更整洁的代码实现复杂的递归。就是这样。正确吗?
3个回答

5

有一件事情会阻止你在Java中编写递归代码:尾调用消除(TCE)。在Java中,深度递归可能会导致StackOverflowException异常,而在Scala中,尾调用将被优化(内部表示为循环)。

那么说Scala只是通过使用模式匹配使得编写简洁的递归更容易吗?

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


4

当然,你可以在Java中进行复杂的递归。如果你愿意,你甚至可以在汇编语言中进行复杂的递归。但是,在Scala中进行这个操作要更容易一些。 此外,Scala拥有尾递归优化,如果你想将任意迭代算法作为递归方法来编写,而不会遇到栈溢出或性能下降,尾递归优化非常重要。


2

很少有编程语言实际禁止您编写不可变代码。实际上,真正的纯函数式语言可能只有Haskell,即使Scheme和ML也有一些使用可变值的方法。因此,函数式风格只是鼓励您编写不可变代码。这取决于您选择是否更改该值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接