به‌خاطرسپاری (رایانش)
بعضی از دیگر ملاحظات > مموایزکردن اتوماتیک

اگر چه ممکن است مموایز کردن به توابع به صورت داخلی و واضح به وسیلهٔ یک برنامه‌نویس کامپیوتر، بیسار شبیه به روش اشاره شده در بالا که برای اجرای فاکتوریل بود، اضافه شود، توابع شفاف ارجاعی ممکن است به صورت اتوماتیک و خارجی مموایز شوند. تکنیک‌هایی که توسط Peter Norvig به کار گرفته شده‌اند کاربردهایی نه تنها در LISP مرسوم (زبانی که در آن در مقاله اش مموایزکردن اتوماتیک رانشان داد)، بلکه در تعداد زیادی از زبان‌های برنامه‌نویسی دیگر دارد. کاربردهای مموایز اتوماتیک به‌طور رسمی در مطالعات دوباره‌نویسی اصطلاح و هوش مصنوعی جستجو شده‌اند.
در زبان‌های برنامه‌نویسی جایی که توابع اشیاء کلاس پایه هستند (نظیر Lua, Python, یا Perl)، مموایز کردن اتوماتیک می‌تواند توسط جایگزینی (در زمان اجرا) یک تابع با مقدار محاسبه شده اش وقتی که یک مقدار از محاسبه به ازای پازامترهای داده شده به دست آمد، اجرا شود. تابعی که این جایگزینی مقدار برای تابع شیء را انجام می‌دهد می‌تواند به‌طور کلی هر تابع ارجاعی شفافی را بسته‌بندی کند. شبه‌کد پایین را در نظر بگیرید (جایی که فرض شده توابع از مقادیر کلاس پایه هستند):
function memoized-call
 if F has no attached array values then
 allocate an associative array called values;
 attach values to F;
 end if;
if F.values[arguments] is empty then
 F.values[arguments] = F(arguments);
 end if;
return F.values[arguments];
 end function
به منظور فراخوانی نسخهٔ مموایزشده اتوماتیک فاکتوریل با استفاده از استراتژی بالا، به جای فراخوانی مستقیم فاکتوریل، کد
فراخوانی مموایز ((factorial(n) را فراخوانی می‌کند. همچنین فراخوانی‌ای درابتدا چک می‌کند تا ببیند که آیا یک آرایه نگه دارنده برای ذخیره‌سازی نتایج اختصاص داده شده است، وگرنه، آن آرایه را الحاق می‌کند. اگر هیچ آرایه‌ای در مکان [values [arguments نباشد (جایی که آرگمان‌ها به‌عنوان کلید آرایه شرکت پذیر استفاده شده‌اند) و یک فراخوانی واقعی به فاکتوریل با آرگمان‌های فراهم شده درست می‌شود. درآخر، ورودی در آرایه در موقعیت کلید به فراخواننده بازمی‌گردد.
استراتژی بالا به بسته‌بندی واضح در هر فراخوانی به یک تابع که می‌خواهد مموایز شود احتیاج دارد. در زبان‌هایی که به بستن اجازه می‌دهند مموایز کردن می‌تواند به‌طور ضمنی توسط یک کارخانه‌ی عمل‌کننده که یک شیء تابع مموایزشده را بسته‌بندی می‌کند، تحت تأثیر قرار بگیرد. در شبه‌کد، این مورد می‌تواند به این صورت بیان شود:
function construct-memoized-functor
allocate a function object called memoized-version;
let memoized-version(arguments) be
      if self has no attached array values then [self is a reference to this object]
 allocate an associative array called values;
 attach values to self;
 end if;
if self.values[arguments] is empty then
 self.values[arguments] = F(arguments);
 end if;
return self.values[arguments];
 end let;
return memoized-version;
end function
به جای فراخوانی فاکتوریل، یک شیء جدید تابع memfact به صورت مقابل ایجاد می‌شود.
memfct = construct-memoized- functor factorial
مثال بالا فرض می‌کند که تابع فاکتوریل قبل از فراخوانی به تابع construct-memoized-functor ایجاد شده است. از این‌جا به بعد، memfact(n) هر وقت فاکتوریل n مورد نیاز باشد، فراخوانی می‌شود. در زبان‌هایی نظیر Lua، تکنیک‌های پخته‌تر بیشتری وجود دارند که به یک تابع اجازه می‌دهند تا با یک مقدار جدید با اسم مشابه جایگزین شود اجازه خواهند داد که:
factorial = construct-memoized-functor factorial
به‌طور ضروری، چنین تکنیک‌هایی الحاق کردن شیء تابع اصلی را به عمل‌کننده ایجاد شده و ارسال فراخوانی‌ها را به تابع اصلی که توسط یک اسم مستعار مموایز شده‌اند را هنگامی که یک فراخوانی به تابع اصلی نیاز است، شامل می‌شوند. (برای جلوگیری از بازگشتی بی پایان) و همانند چیزی که در پایین نشان داده شده:
function construct-memoized-functor
allocate a function object called memoized-version;
let memoized-version(arguments) be
 if self has no attached array values then [self is a reference to this object]
 allocate an associative array called values;
 attach values to self;
 allocate a new function object called alias;
 attach alias to self; [for later ability to invoke F indirectly]
 self.alias = F;
 end if;
if self.values[arguments] is empty then
 self.values[arguments] = self.alias(arguments); [not a direct call to F]
 end if;
return self.values[arguments];
 end let;
return memoized-version;
end function
(توجه کنید: بعضی از قدم‌هایی که در بالا نشان داده شد ممکن است به‌طور ضمنی به وسیلهٔ زبان پیاده‌سازی اداره شوند و برای نشان دادن مهیا شده‌اند)