为什么Memoized Fibonacci的实现不起作用?

时间:2015-01-08 07:12:14

标签: java dictionary hashmap fibonacci

class Fib {
  public Map<Integer, Integer> memo = new HashMap<Integer, Integer>();

  Fib() {
    memo.put(0, 1);
    memo.put(1, 1);
  }

  public Integer fibonacciMemoized(Integer n) {
    if (memo.containsKey(n)) {
      return memo.get(n);
    } else {
      int fibo = fibonacciMemoized(n-1) + fibonacciMemoized(n-2);
      return memo.put(n, fibo);
    }
  }
}

此代码提供NullPointerException。但是,如果我将最后一个return语句分解为:

 memo.put(n, fibo);
 return fibo;

然后它的工作原理。怎么会?不会put()返回放入地图的值吗?

2 个答案:

答案 0 :(得分:3)

不,它没有。您可以在JavaDocs中阅读,其中明确指出put会返回与密钥相关联的上一个值,如果没有密钥映射,则返回null

  

V put(K key, V value)

     

将指定的值与此映射中的指定键相关联(可选操作)。如果映射先前包含键的映射,则旧值将替换为指定的值。 (当且仅当m.containsKey(k)返回true时,地图m才包含密钥k的映射。)

     

<强>参数:
  key - 与指定值关联的键   value - 与指定键关联的值

     

<强>返回:   与key关联的 previous 值,如果没有key的映射关系,则返回null。 (如果实现支持空值,则null返回也可以指示映射先前将null与key关联。)

因此,对于您的代码,必须使用以下内容:

memo.put(n, fibo); // will NOT return the value
return fibo;       // and here it is returned

答案 1 :(得分:0)

Map.put会返回给定密钥的上一个值,而不是您现在分配给它的值。在您的情况下,当您第一次遇到每个密钥时,请致电put,因此它会返回null