به‌خاطرسپاری (رایانش)
بررسی اجمالی

یک تابع به‌خاطرسپاری نتایجی را که با مجموعه‌هایی از ورودی‌های خاص مرتبط است «به خاطر می‌سپارد». فراخوانی‌های بعدی با ورودی‌های به خاطر سپرده شده نتایج را به جای محاسبه مجدد آن برمی‌گرداند، بنابراین هزینه اولیه فراخوانی با پارامترهای داده‌شده را از همهٔ (به‌جز اولین) فراخوانی‌های تابع با آن پارامترها حذف می‌کند. مجموعهٔ ارتباطات به خاطر سپرده شده ممکن است یک مجموعه با اندازه ثابت باشد که توسط الگوریتم‌های جایگزینی یا یک مجموعه ثابت کنترل شود که بستگی به طبیعت تابع و کاربردهای آن دارد. یک تابع در صورتی می‌تواند به‌خاطرسپاری شود که به‌طور ارجاعی شفاف باشد؛ که فقط در صورتی ممکن است که، فراخوانی تابع دقیقاً اثری مشابه با جایگزینی فراخوانی تابع با مقدار بازگشتی آن داشته باشد (اگرچه، موارد استثناء خاصی نیز برای این محدودیت وجود دارد). درحالی‌که مموایز کردن با جداول مراجعه مرتبط است، چون اغلب از چنین جداولی در اجرایش استفاده می‌کند، اما مموایز کردن فضای کش نتایج اش را به‌طور شفاف و در حین اجرا، در صورت نیاز، و نه پیشاپیش، پر می‌کند.
مموایز کردن یک وسیله برای پایین آوردن هزینه زمان تابع در عوض افزایش هزینه فضا است؛ که به این معنی است که توابع مموایزشده برای افزایش سرعت در عوض استفادهٔ بیشتر از حافظه کامپیوتر بهینه می‌شوند. «هزینه» فضا/زمان الگوریتم‌ها اسم خاصی در رایانش به نام پیچیدگی محاسباتی دارند. همهٔ توابع یک پیچیدگی محاسباتی در زمان (یعنی: زمانی که برای اجرا لازم دارند) و در فضا دارند.
اگرچه یک بده بستان در رابطه با فضا-زمان اتفاق می‌افتد (یعنی:فضای بیشتری مصرف شده و در عوض سرعت بیشتر می‌شود)، اما با دیگر بهینه‌سازی‌ها که بده بستان فضا-زمان دارند نظیر کاهش قدرت، متفاوت است، به این معنی که مموایز کردن یک بهینه‌سازی زمان اجرا است و نه بهینه‌سازی زمان کامپایل. علاوه بر این، کاهش قدرت، به‌طور بالقوه، یک عملیات هزینه بر نظیر ضرب را با یک عملیات کم هزینه تر نظیر جمع جایگزین می‌کند، و میزان کاهش هزینه می‌تواند بسیار وابسته به ماشین (غیرقابل حمل در بین ماشین‌ها) باشند در حالی که مموایز کردن بیشتر مستقل از ماشین می‌باشد و در پلتفرم‌های مختلف قابل جابجایی می‌باشد(کراس پلتفرم).
تابع شبه‌کد پایین را برای محاسبه فاکتوریل n در نظر بگیرید:
function factorial (n is a non-negative integer)
 if n is 0 then
 return 1 [by the convention that 0! = 1]
 else
 return factorial(n – 1) times n [recursively invoke factorial
                                        with the parameter 1 less than n]
 end if
end function
برای هر عدد صحیح n به‌طوری‌که n≥۰, نتیجه پایانی تابع فاکتوریل غیرمتغیر است. اگر به (x = factorial(3 استناد داده شده باشد، نتیجه طوری است که x همیشه برابر با مقدار ۶ خواهد بود. یک نسخه غیر مموایز از مورد بالا، با طبیعت الگوریتم بازگشتی درگیر داده شده، احتیاج به فراخوانی‌های n + 1 فاکتوریل دارد تا به نتیجه بالا برسد و هرکدام از این فراخوانیها، به نوبه خود، هزینه‌ای مرتبط در زمان می‌گیرد تا تابع مقدار محاسبه‌شده را بازگرداند. بسته به ماشین، این نتیجه جمع موارد زیر خواهد بود:
هزینهٔ راه‌اندازی قالب فراخوانی پشتهٔ کاربردی
هزینهٔ مقایسه n تا ۰
هزینهٔ کم کردن ۱ از n
هزینهٔ راه‌اندازی فراخوانی قالب پشته بازگشتی (مثل بالا)
هزینهٔ ضرب نتیجهٔ فراخوانی بازگشتی به فاکتوریل به وسیلهٔ n
هزینهٔ ذخیره کردن نتیجهٔ بازگشت، طوری‌که ممکن است به وسیلهٔ محتوای فراخوانی مورد استفاده واقع شود.
در یک اجرای غیرمموایز، هر فراخوانی سطح‌بالا به فاکتوریل شامل هزینهٔ انباشتهٔ مراحل ۲ تا ۶ متناسب با مقدار n اولیه است.
یک نسخهٔ مموایزشده از تابع فاکتوریل به این صورت است:
function factorial (n is a non-negative integer)
 if n is 0 then
 return 1 [by the convention that 0! = 1]
 else if n is in lookup-table then
 return lookup-table-value-for-n
 else
 let x = factorial(n – 1) times n [recursively invoke factorial
                                         with the parameter 1 less than n]
 store x in lookup-table in the nth slot [remember the result of n! for later]
 return x
 end if
end function
دراین مثال خاص، اگر فاکتوریل در ابتدا با ۵ فراخوانی شود و سپس بعداً باهر مقداری کم‌تر یا برابر با ۵ فراخوانی شود، آن مقادیر بازگشتی همچنین مموایز خواهند شد، چون فاکتوریل به صورت بازگشتی با مقادیر۰و۱و۲و۳و۴و۵ فراخوانی خواهند شد، و مقادیر بازگشتی برای هر کدام از آن‌ها ذخیره خواند بود. اگر آن بعداً با یک شماره بزرگتر از ۵، نظیر ۷فراخوانی شود، فقط ۲ فراخوانی بازگشتی(۶و۷)انجام می‌شود و نتیجه !۵ از قبل ذخیره شده است. در این روش، مموایز کردن به یک تابع اجازه می‌دهد که از نظر زمانی بیشتر بهینه شود مادامی که بیشتر فراخوانی می‌شود، بنابراین منتهی به یک افزایش سرعت نهایی می‌شود.