java - 将 HashMap 传递给递归方法不起作用?

标签 java recursion hashmap memoization

我声明 HashMap 用于内存并将其传递给递归方法,但看起来 HashMap 并没有真正存储数据并在每次递归调用时重置。下面是一个示例:

    public static int fib(int n) {
        Map<Integer, Integer> memo = new HashMap<>();
        return fib(n, memo);
    }

    private static int fib(int n, Map<Integer, Integer> memo) {
        if (n < 0) {
            throw new IllegalArgumentException(
                "Index was negative. No such thing as a negative index in a series.");

        // base cases
        } else if (n == 0 || n == 1) {
            return n;
        }

        // see if we've already calculated this
        if (memo.containsKey(n)) {
            System.out.printf("grabbing memo[%d]\n", n);
            return memo.get(n);
        }

        System.out.printf("computing fib(%d)\n", n);
        int result = fib(n - 1) + fib(n - 2);

        // memoize
        memo.put(n, result);

        return result;
    }

输出如下

computing fib(10)
computing fib(9)
computing fib(8)
computing fib(7)
computing fib(6)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(6)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(7)
computing fib(6)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(8)
computing fib(7)
computing fib(6)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(6)
computing fib(5)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)
computing fib(3)
computing fib(2)
computing fib(4)
computing fib(3)
computing fib(2)
computing fib(2)

但是如果我将 HashMap 作为静态变量并在我的 fib() 之外声明它,它就可以正常工作,但这不是我想要做的。谁能帮帮我吗?

谢谢。

最佳答案

方法fib(int, Map)实际上从未被递归调用。您每次创建的 map 都不会被使用。摆脱 fib(int) 并替换为对 fib(int, Map) 的调用。

fib(n - 1, memo) + fib(n - 2, memo);

关于java - 将 HashMap 传递给递归方法不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61037485/

相关文章:

.net - .NET 的替代 RegEx 引擎,支持递归

hashmap - 如何为我自己的结构实现 Eq 和 Hash 以将它们用作 HashMap 键?

java - 替换字符串中的多个子字符串,Array vs HashMap

java - 无法使用 JERSEY 下载文件

java - Spring Boot - 使配置最终化

list - LISP 比较板中的元素

c++ - 在递归中使用引用会导致内存泄漏?

Java 难题 - 尝试在单击按钮后处理 GUI

java - Solr 按距离和新鲜度排序

Java TreeMap put vs HashMap put,自定义对象作为键