【问题标题】:Catalan Number recursive in ScalaScala中的加泰罗尼亚数递归
【发布时间】:2016-07-01 12:56:33
【问题描述】:

我知道如何在 java 中计算加泰罗尼亚数,这很简单:

int catalan(int n) {
    int res = 0;

    // Base case
    if (n <= 1) {
        return 1;
    }
    for (int i = 0; i < n; i++) {
        res += catalan(i) * catalan(n - i - 1);
    }
    return res;
}

但我无法想象如何在 Scala 中做到这一点,因为我对它完全陌生。 不使用 var 是否可以做到这一点?

我尝试了以下方法,但它不起作用:

object Catalan {

  def catalan: Int => Int = n => {
    val res = 0
    val i = 0

    if (n <= 1) 1 
    else for (i <- 0 to n-1) res += catalan(i) * catalan(n - i - 1)
  }

}

提前致谢:)

【问题讨论】:

    标签: java scala recursion numbers recursive-datastructures


    【解决方案1】:

    这个怎么样?

    def catalan(n: Int): Int = 
      if (n <= 1) 1 
      else (0 until n).map(i => catalan(i) * catalan(n - i - 1)).sum
    

    在这里,我执行与您的 java 实现相同的操作,但不是使用 var,而是使用范围(0 到 n)并使用它来创建总和。

    实现性能可以极大地受益于记忆。

    【讨论】:

    【解决方案2】:

    我使用的是fold 而不是res += ,其余逻辑与您的java算法相同:

    def catalan(n: Int): Int = {
          if (n <= 1) 1
          else (0 until n).fold(0)((acc, i) => acc + catalan(i) * catalan(n - i - 1))
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 2012-04-19
      相关资源
      最近更新 更多