【问题标题】:Scala recursion no side effectsScala递归没有副作用
【发布时间】:2013-05-18 13:28:51
【问题描述】:

好的,我知道所有递归都更实用,因为您不会在迭代中更改任何对象的状态。然而,没有什么能阻止你在 scala 中这样做。

  var magoo = 7; 

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

  }

事实上,在 Scala 中,您可以像在 Java 中一样使递归无副作用。 那么可以说 Scala 通过使用模式匹配更容易编写简洁的递归吗?就像没有什么能阻止我用 Java 编写任何可以用 Scala 编写的无状态递归代码?

关键在于,在 Scala 中,复杂的递归可以用更简洁的代码来实现。 就这样。 对吗?

【问题讨论】:

    标签: scala recursion


    【解决方案1】:

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

    所以说 Scala 只是让简洁的编写变得更容易公平吗 使用模式匹配进行递归?

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2012-10-02
          • 2015-09-02
          • 1970-01-01
          • 1970-01-01
          • 2019-12-03
          • 1970-01-01
          • 2011-09-16
          • 2012-07-22
          • 2016-11-05
          相关资源
          最近更新 更多