Java 为什么这种记忆化斐波那契的实现不起作用?

Java 为什么这种记忆化斐波那契的实现不起作用?,java,dictionary,hashmap,fibonacci,Java,Dictionary,Hashmap,Fibonacci,然后它就起作用了。怎么会?是否put()返回放入映射的值?否,它不返回。您可以在中阅读,其中明确指出,put返回与键关联的previous值,或者null(如果键没有映射) V put(K键,V值) 将指定值与此映射中的指定键关联(可选操作)。如果映射以前包含键的映射,则旧值将替换为指定值。(称映射m包含密钥k的映射,当且仅当m.containsKey(k)返回true。) 参数: 键-与指定值关联的键 value—与指定键关联的值 返回: 与键关联的上一个值,如果键没有映射,则为null。(如

然后它就起作用了。怎么会?是否
put()
返回放入映射的值?

否,它不返回。您可以在中阅读,其中明确指出,
put
返回与键关联的previous值,或者
null
(如果键没有映射)

V put(K键,V值)

将指定值与此映射中的指定键关联(可选操作)。如果映射以前包含键的映射,则旧值将替换为指定值。(称映射m包含密钥k的映射,当且仅当m.containsKey(k)返回true。)

参数:
键-与指定值关联的键
value—与指定键关联的值

返回: 与键关联的上一个值,如果键没有映射,则为null。(如果实现支持null值,则null返回还可以指示先前与key关联的映射为null。)

因此,对于您的代码,必须使用以下内容:

 memo.put(n, fibo);
 return fibo;

返回给定键的上一个值,而不是您现在分配给它的值。在您的例子中,当您第一次遇到每个键时,您调用
put
,因此它将返回
null

否。它不返回已放置的值:,它返回“与键关联的上一个值,如果键没有映射,则返回null”。请参阅put将返回上一个值而不是新值。如果使用Java 8,您可以使用
Map
.computeIfAbsent()
与您的问题无关,但将
[0,n)
范围内的所有整数作为键的Map更被称为数组/列表。
 memo.put(n, fibo);
 return fibo;
memo.put(n, fibo); // will NOT return the value
return fibo;       // and here it is returned