Java ::为什么这个具有memoization的Fibonacci序列的实现不起作用?

时间:2015-01-01 04:50:42

标签: java algorithm dynamic-programming fibonacci

我有一个关于使用memoization(DP)实现Fibonacci序列的快速问题。我正在使用HashTable,但由于某种原因,该表似乎永远不会包含这些元素。我插入一个print语句,以便在从哈希表中读取值时打印出来,似乎这种情况从未发生过。我觉得这是一个简单的修复,但我没有看到它。

  public static int getFib(int n) {
        HashMap<Integer, Integer> dictionary = new HashMap<Integer, Integer>();
        if (n <= 2)
            return 1;
        else if (dictionary.containsKey(n)) {
            System.out.println("Reading From Table");
            return dictionary.get(n);
        } else {
            int val = getFib(n - 1) + getFib(n - 2);
            dictionary.put(n, val);
            return val;
        }
    }

4 个答案:

答案 0 :(得分:5)

您以递归方式调用getFib(),并在每次调用时实例化一个新字典。使字典成为类级变量。

答案 1 :(得分:4)

dictionarylocal variable,因此此变量的范围在函数getFib内。

如果您以递归方式调用函数getFib,则每次hash map will be created and instantiatedscope of the hashmap dictionary will end on returning from the function

您可以使用global variable来解决此问题。

答案 2 :(得分:3)

在方法之外初始化字典。 现在,您正在每次递归调用中创建一个新的“字典”。

答案 3 :(得分:2)

使dictionary成为成员变量而不是局部变量

private HashMap<Integer, Integer> dictionary = new HashMap<Integer, Integer>();

public static int getFib(int n) {

    // some operations
}