我被要求编写一个递归函数,该函数将计算沿具有 n × n 方格的网格边缘的单调格子路径的加泰罗尼亚数,这些格子路径不会超过对角线(图片)
我不允许用于-循环,只有递归调用......这就是我所做的:
public long C(int n) {
if (n == 1)
return 0;
return C(n, 0, 0);
}
private long C(int n, int i, int j) {
// CAN MOVE UP & RIGHT
if (j - i > 0 && j + 1 <= n)
return paths(n, i + 1, j) + paths(n, i, j + 1);
// CAN MOVE UP
else if (j - i > 0)
return paths(n, i + 1, j);
// CAN MOVE RIGHT
else if (j + 1 <= n)
return paths(n, i, j + 1);
// CAN'T MOVE
else
return 1;
}
我不知道这段代码是否最好,但它可以工作......我想将此函数转换为 Memoized 函数。但我不明白它如何以及为什么它会使功能更高效。我理解为什么记忆中的斐波那契更有效,但是在这里我总是必须到达路径的末尾然后返回 1 或 0 那么如果我将 1 / 0 存储在一个数组中有什么关系呢?
感谢您的任何帮助