対角線の上を通過しない、n × n の正方形セル ( pic )
を持つグリッドのエッジに沿った単調格子パスのカタロニア語数を計算する再帰関数を作成するように依頼されました ( pic )。ループ、再帰呼び出しのみ...これは私がしたことです:
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;
}
このコードが最適かどうかはわかりませんが、機能します... この関数をメモ化関数に変換したいと考えています。しかし、それが機能をより効率的にする方法と理由を理解できません。メモ化されたフィボナッチの方が効率的である理由は理解できますが、ここでは常にパスの最後に到達してから 1 または 0 を返さなければならないので、配列内に 1 / 0 を格納するとどうなりますか?
あらゆる種類の助けをありがとう