#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
。同じ式を使用する純粋な再帰関数を記述したため、これがメモ化を使用していることはわかっていますが、これは、の値がはるかに大きい場合にはるかに高速ですn
。私はこれまでベクターを使用したことがありませんが、いくつかの調査を行い、ベクターの概念を理解しています。メモ化では、計算された各値が保存されることになっているため、同じ計算を繰り返し実行する代わりに、すでに計算された値を簡単に取得できることを理解しています。
私の質問は、このメモ化はどのように行われ、どのように機能するのかということです。nの値がすでに存在するかどうかを確認する時点で、コードを確認できないようです。また、の目的がわかりませんif(as[n]<=0)
。この式は正と負の値を生成する可能性があるため、このチェックが何を探しているのかわかりません。
ありがとう、私はこれがどのように機能するかを理解していると思います。実際、私が思っていたよりも少し単純です。
シーケンス内の値が0になることはないと思います。したがって、nは1から開始する必要があると思うので、これでうまくいくはずです。
しかし、ゼロが私のシーケンスで実行可能な数であった場合、それを解決できる別の方法は何ですか?たとえば、5つが表示されない場合はどうなりますか?ベクトルを5で埋める必要がありますか?
編集:うわー、コードをチェックしてこれを入力しているときに、他にもたくさんの応答がありました。皆さんの助けに感謝します、私は今それを理解していると思います。