簡體   English   中英

為什么Memoized Fibonacci的實現不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM