保存递归值以进行进一步的计算

时间:2018-11-20 16:49:22

标签: java

我必须找出一项任务的不同组合(如何将香料与不同的餐点结合在一起)。我使用了递归来获取解决方案。递归正在运行,并且J-Unit测试成功。我的问题是我想存储我的值,这些值是递归不会一次又一次地计算出来的。 我必须要做哪些机会?

这是我当前的代码。

public class FoodCombinations {

  public static long tasty(int v, int g) {

    if (v == g || v == 1) {
        return 1 * 2;
    }
    return tasty(v - 1, g - 1) + v * tasty(v, g - 1);
  }
}

2 个答案:

答案 0 :(得分:2)

关键词是记忆。

将结果存储在哈希图中,在计算之前先查找它们。如何立即查找两个参数有一点复杂,要正确执行此操作,您将必须创建一个包含两个项目的小类,这些项目既可以实现HashMap(hashCode)的需求,也可以实现TreeMap(Comparable接口)的需求并使用类作为关键。或者,您可以使用简单而肮脏的String hack:

public class FoodCombinations {

  static Map<String, Long> cache = new HashMap<>();

  public static long tasty(int v, int g) {
    String key = v+"|"+g;
    if (cache.containsKey(key)) return cache.get(key);
    long result;
    if (v == g || v == 1) {
        result = 1 * 2;
    } else {
        result = tasty(v - 1, g - 1) + v * tasty(v, g - 1);
    }
    cache.put(key, result);
    return result;
  }
}

答案 1 :(得分:0)

我用私有方法解决了它。看上去与您的解决方案类似,但是使用私有方法而不是哈希图。