#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);
}
L'exemple de code ci-dessus utilisant la mémoisation pour calculer une formule récursive basée sur une entrée n
. Je sais que cela utilise memoization, parce que j'ai écrit une fonction purement récursive qui utilise la même formule, mais celui-ci beaucoup, beaucoup plus rapide pour des valeurs beaucoup plus grandes de n
. Je n'ai jamais utilisé de vecteurs auparavant, mais j'ai fait quelques recherches et je comprends leur concept. Je comprends que la mémorisation est supposée stocker chaque valeur calculée, de sorte qu'au lieu d'effectuer à nouveau les mêmes calculs, elle peut simplement récupérer ceux qui ont déjà été calculés.Comment cette fonction C++ utilise-t-elle la mémorisation?
Ma question est: comment est cette mémo, et comment ça marche? Je n'arrive pas à voir dans le code à quel point il vérifie si une valeur pour n existe déjà. En outre, je ne comprends pas le but de la if(as[n]<=0)
. Cette formule peut donner des valeurs positives et négatives, donc je ne suis pas sûr de ce que cette vérification recherche.
Merci, je pense que je suis proche de comprendre comment cela fonctionne, il est en fait un peu plus simple que je pensais qu'il était.
Je ne pense pas que les valeurs de la séquence ne peut jamais être 0, donc cela devrait fonctionner pour moi, je pense que n doit commencer à 1.
Toutefois, si nul était un nombre viable dans ma séquence , quelle est une autre façon de le résoudre? Par exemple, et si cinq ne pouvaient jamais apparaître? Aurais-je juste besoin de remplir mon vecteur avec cinq? Edit: Wow, j'ai eu beaucoup d'autres réponses tout en vérifiant le code et en tapant celui-ci. Merci pour l'aide tout le monde, je pense que je comprends maintenant.
Je pense qu'il faut encore du temps exponentiel lorsque la vérification est comme [n] <= 0, juste avec une base plus petite. En effet, essayez de calculer un (10000) - il ne finira jamais, même si cela ne prend pas de temps avec le bon chèque. –