Java 保存递归值以供进一步计算

Java 保存递归值以供进一步计算,java,Java,我必须找出一个作业的不同组合(如何将香料与不同的食物组合)。我使用递归得到了解决方案。递归工作正常,J单元测试成功。我的问题是,我想存储我的值,这些值是经过计算的值,递归不会一次又一次地计算它们。 我有哪些机会这样做 这是我当前的代码 public class FoodCombinations { public static long tasty(int v, int g) { if (v == g || v == 1) { return 1 * 2; }

我必须找出一个作业的不同组合(如何将香料与不同的食物组合)。我使用递归得到了解决方案。递归工作正常,J单元测试成功。我的问题是,我想存储我的值,这些值是经过计算的值,递归不会一次又一次地计算它们。 我有哪些机会这样做

这是我当前的代码

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);
  }
}

关键词是记忆化

将结果存储在hashmap中,在计算之前查找它们。关于如何一次查找两个参数有一点复杂,要正确地执行此操作,您必须创建一个包含两项的小型类,实现HashMap(hashCode)或TreeMap(Compariable interface)的要求,并将该类用作键。或者你可以使用一个简单而肮脏的字符串破解:

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;
  }
}
公共类食物组合{
静态映射缓存=新的HashMap();
公共静态长味(int v,int g){
字符串键=v+“|”+g;
if(cache.containsKey(key))返回cache.get(key);
长期结果;
如果(v==g | | v==1){
结果=1*2;
}否则{
结果=美味(v-1,g-1)+v*美味(v,g-1);
}
cache.put(键、结果);
返回结果;
}
}

我用私有方法解决了这个问题。查看与您的解决方案类似的结尾,但使用私有方法而不是哈希映射。

您是指每次迭代的值而不是最终结果吗?您能否提供可用的代码?什么是埃森函数?什么是v和g?是的,每个迭代的值。递归“记住”该值,不再计算它。将arraylist作为参数传递并在其中保存值。或者定义静态arraylist并将其用于存储值sorry应该是return tasty(v-1,g-1)+v*tasty(v,g-1)