2013-05-18 135 views
3

好吧,我得到这个所有的递归更实用,因为你没有改变迭代中任何对象的状态。但是没有什么能阻止你在scala中做到这一点。斯卡拉递归没有副作用

var magoo = 7; 

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

    } 

事实上,你可以递归就像在斯卡拉侧effectless,你可以在Java中。 因此,说Scala只是简化使用模式匹配来编写简洁的递归是否公平呢?就像没有什么能阻止我用Java编写任何无状态的递归代码,我可以在Scala中编写代码?

这点真的是在斯卡拉复杂的递归可以用整洁的代码来实现。 就是这样。 是否正确?

回答

4

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

5

会阻止你用Java编写递归代码:尾部呼叫消除(TCE)。在Java中,可能会在深递归中获得StackOverflowException,而in Scala tail calls will be optimized(内部表示为循环)。

因此,它是公平地说,斯卡拉只是使其更易于使用模式匹配写简洁 递归?

我认为在斯卡拉这两个概念是相互正交的。

2

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