#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