Scala 中的加泰罗尼亚数字递归
Catalan Number recursive in Scala
我知道如何计算 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)
}
}
提前致谢:)
这个怎么样?
def catalan(n: Int): Int =
if (n <= 1) 1
else (0 until n).map(i => catalan(i) * catalan(n - i - 1)).sum
这里我做的和您的 java-实现一样,但我使用范围(0 到 n)代替 var,并使用它来创建总和。
实施性能可以从记忆中受益匪浅。
我正在使用 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))
}
我知道如何计算 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)
}
}
提前致谢:)
这个怎么样?
def catalan(n: Int): Int =
if (n <= 1) 1
else (0 until n).map(i => catalan(i) * catalan(n - i - 1)).sum
这里我做的和您的 java-实现一样,但我使用范围(0 到 n)代替 var,并使用它来创建总和。
实施性能可以从记忆中受益匪浅。
我正在使用 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))
}