#include <vector>
std::vector<long int> as;
long int a(size_t n){
if(n==1) return 1;
if(n==2) return -2;
if(as.size()<n+1)
as.resize(n+1);
if(as[n]<=0)
{
as[n]=-4*a(n-1)-4*a(n-2);
}
return mod(as[n], 65535);
}
上面的代码示例使用 memoization 根据一些输入计算递归公式n
。我知道这使用了记忆化,因为我编写了一个使用相同公式的纯递归函数,但是对于更大的n
. 我以前从未使用过向量,但我做了一些研究,我理解了它们的概念。我知道记忆应该存储每个计算的值,这样它就可以简单地检索已经计算过的值,而不是再次执行相同的计算。
我的问题是:这个记忆如何,它是如何工作的?我似乎无法在代码中看到它检查 n 的值是否已经存在。另外,我不明白if(as[n]<=0)
. 这个公式可以产生正值和负值,所以我不确定这个检查在寻找什么。
谢谢,我想我已经接近理解它是如何工作的了,它实际上比我想象的要简单一些。
我不认为序列中的值永远是 0,所以这应该对我有用,因为我认为 n 必须从 1 开始。
但是,如果零在我的序列中是一个可行的数字,那么我可以解决它的另一种方法是什么?例如,如果五个永远不会出现怎么办?我只需要用五个填充我的向量吗?
编辑:哇,我在检查代码和输入这个代码时收到了很多其他的回复。谢谢大家的帮助,我想我现在明白了。