我有一个关于使用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;
}
}
答案 0 :(得分:5)
您以递归方式调用getFib(),并在每次调用时实例化一个新字典。使字典成为类级变量。
答案 1 :(得分:4)
dictionary
是local variable
,因此此变量的范围在函数getFib
内。
如果您以递归方式调用函数getFib
,则每次hash map will be created and instantiated
和scope 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
}