C++ 为什么回忆录会给出错误的输出?
我试图用递归+记忆法解决一个问题。它只是修改了斐波那契,增加了一个C++ 为什么回忆录会给出错误的输出?,c++,algorithm,recursion,memoization,C++,Algorithm,Recursion,Memoization,我试图用递归+记忆法解决一个问题。它只是修改了斐波那契,增加了一个start+3步骤,只能执行K次。这是我提出的递归代码: #包括 使用名称空间std; int-helper(int-start、int-N、int-K){ //cout您正在缓存完全基于start的db结果,并完全忽略K。但是helper(0,7,0)和helper(0,7,7)需要根据剩余的K在每个索引处缓存完全不同的数字。因此,您需要缓存索引也基于K 我看到了三种优化方法: 拥有缓存。db[start]将是一个std::v
start+3
步骤,只能执行K
次。这是我提出的递归代码:
#包括
使用名称空间std;
int-helper(int-start、int-N、int-K){
//cout您正在缓存完全基于start
的db
结果,并完全忽略K
。但是helper(0,7,0)
和helper(0,7,7)
需要根据剩余的K
在每个索引处缓存完全不同的数字。因此,您需要缓存索引也基于K
我看到了三种优化方法:
- 拥有缓存。
db[start]
将是一个std::vector
,您将在该向量中使用indexK
来访问您的项目。这将导致使用更多的内存
- 放弃
std::vector
并使用std::unordered_map
,其中您的密钥是一对(start
,K
)(可能是std::pair
,但最好使用具有更好名称的结构)。这应该使用更少的内存,速度损失很少
- 只有当
K==0
时才缓存值。这不会增加缓存大小,但当K
较大时,也会失去很多缓存好处
注意:我很有信心,问题不在于基于上述差异的模,也因为我的输入足够小,模实际上没有任何区别。算法在做什么?它看起来像某种修改过的斐波那契?是的,没错。修改过的斐波那契加上一个附加的start+3
步骤只能做K次
次。啊,太好了!我还没意识到。谢谢!:)