优化java方法(找到基于骰子达到某一点的所有方法)

时间:2016-08-23 11:24:09

标签: java optimization tail-recursion

我做了这个方法来解决我需要通过从骰子(1-6)采取步骤覆盖距离的问题,并计算所有可能的方法来达到距离 我做了这个方法

static int watchCount(int distance)
{
    // Base cases
    if (distance<0) return 0;
    if (distance==0) return 1;

    return watchCount(distance-1) +
        watchCount(distance-2) +
        watchCount(distance-3)+
        watchCount(distance-4) +
        watchCount(distance-5)+
        watchCount(distance-6);

}   

但是对于像> 500这样的大值,这种方法需要很长时间,任何优化的帮助都会受到赞赏。 感谢

2 个答案:

答案 0 :(得分:1)

这是动态编程的经典问题。创建一个大小为Department的数组(其中Employee是您要查找的数字)并继续工作,通过增加获取值的方式来更新数组。这样,您可以在_context.Entry(employee.Department).State = EntityState.Unchanged; 复杂度中执行此操作(目前复杂性是指数级的)。

答案 1 :(得分:1)

您可以使用这样的缓存(与@PiotrWilkin相同的想法):

static int watchCount(int distance, Integer[] cache) {
    // Base cases
    if (distance < 0) {
        return 0;
    }
    if (distance == 0) {
        return 1;
    }
    if (cache[distance-1] == null) {
        cache[distance-1] = watchCount(distance - 1, cache)
                + watchCount(distance - 2, cache)
                + watchCount(distance - 3, cache)
                + watchCount(distance - 4, cache)
                + watchCount(distance - 5, cache)
                + watchCount(distance - 6, cache);
    }
    return cache[distance-1];
}

EDIT迭代实施:

public static int iterativeWatchCount(int n) {
    if (n < 0) {
        return 0;
    }
    int index = 0;
    int[] cache = new int[6];
    cache[cache.length - 1] = 1;
    int sum = 1;
    for (int i = 0; i < n; i++, index = (index + 1) % cache.length) {
        sum = cache[0] + cache[1] + cache[2] + cache[3] + cache[4] + cache[5];
        cache[index] = sum;
    }
    return sum;
}