暂时试图找出这个问题,但无法解决这个问题。
问题:鉴于以下方法。通过记忆优化它。
public static long cat(int n) {
if (n == 0)
return 1;
long result = 0;
for (int i = 0; i < n; i++) {
result += cat(i) * cat(n - i - 1);
}
return result;
}
我尝试过:
private static int memCat(int n, int[] cache) {
if (n == 0) {
return 1;
}
int result = 0;
if (cache[n] == 0) {
for (int i = 0; i < n; i++) {
result += memCat(i, cache) * memCat(n - i - 1, cache);
}
cache[n] = result;
}
return result;
}
我的想法是,因为内部for循环中的所有计数的结果将被保存。所以不必重复。
public static void main(String[] args) {
System.out.println(cat(5)); //Prints 42
System.out.println(memCat(5, new int[5 + 1])); //Prints 1
}
我的眼睛和大脑都很累,所以这可能只是一个简单的错误。
答案 0 :(得分:1)
您的实施问题是您准备cache[]
,但您从未使用它。这是修复,它相当简单:
int result = cache[n];
if (result == 0) {
for (int i = 0; i < n; i++) {
result += memCat(i, cache) * memCat(n - i - 1, cache);
}
cache[n] = result;
}
现在,cache
的值在之前计算时会返回,因为result
在输入条件之前会被赋值为cache[n]
。