#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);
}
上面的代码示例使用记忆来计算基于一些输入n
的递归公式。我知道这使用memoization,因为我已经写了一个纯粹的递归函数,它使用相同的公式,但是这对于更大的值n
要快得多。我以前从未使用过载体,但我已经做了一些研究,并且了解它们的概念。我知道memoization应该存储每个计算的值,以便不再执行相同的计算,而是可以简单地检索已经计算的值。这个C++函数如何使用记忆?
我的问题是:这是怎么记忆化,以及它是如何工作的?我似乎无法在代码中看到它检查n的值是否已经存在。另外,我不明白if(as[n]<=0)
的目的。这个公式可以产生正面和负面的价值,所以我不确定这张支票正在寻找什么。
谢谢,我想我已经接近了解它是如何工作的,它实际上比我想象的要简单一些。
我不认为序列中的值都不能为0,所以这应该为我工作,因为我认为n具有在1
但是开始,如果零在我的序列号可行,我能以另一种方式解决它?例如,如果五个永远不会出现?我只需要用五个人来填充我的矢量?
编辑:哇,我得到了很多的其他的反应,同时检查代码并输入这一个。感谢大家的帮助,我想我现在明白了。
我认为当检查结果为[n] <= 0时,只需要较小的基数,它仍然需要指数时间。确实,计算一个(10000) - 它将永远不会完成,即使它没有花时间进行正确的检查。 – 2008-09-29 03:45:17