我必须找出一项任务的不同组合(如何将香料与不同的餐点结合在一起)。我使用了递归来获取解决方案。递归正在运行,并且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);
}
}
答案 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)
我用私有方法解决了它。看上去与您的解决方案类似,但是使用私有方法而不是哈希图。