[英]Why does this Implementation of Memoized Fibonacci not work?
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()
返回放入地圖的值嗎?
不,它沒有 。 您可以在JavaDocs中讀取,它清楚地表明put
返回與key關聯的先前值,如果沒有key的映射, put
返回null
。
V put(K key, V value)
將指定的值與此映射中的指定鍵相關聯(可選操作)。 如果映射先前包含鍵的映射,則舊值將替換為指定的值。 (當且僅當m.containsKey(k)返回true時,地圖m才包含密鑰k的映射。)
參數:
key - 與指定值關聯的鍵
value - 要與指定鍵關聯的值返回:與key關聯的先前值,如果沒有key的映射,則返回 null。 (如果實現支持空值,則null返回也可以指示映射先前與key關聯null。)
因此,對於您的代碼,必須使用以下內容:
memo.put(n, fibo); // will NOT return the value
return fibo; // and here it is returned
Map.put
返回給定鍵的先前值 ,而不是您現在分配給它的值。 在您的情況下,您在第一次遇到每個鍵時調用put
,因此它將返回null
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.