Якщо ви просто прагнете прискорити рекурсивний алгоритм, запам'ятовування може бути достатньо. Це техніка зберігання результатів викликів функцій, щоб майбутні дзвінки з тими ж параметрами могли просто використати результат. Це застосовно, якщо (і лише якщо) ваша функція
- не має побічних ефектів і
- залежить лише від його параметрів (тобто не від певного стану).
Це заощадить ваш час, якщо (і тільки якщо) функція буде викликана з тими ж параметрами знову і знову. Популярні приклади включають рекурсивне визначення чисел Фібоначчі, тобто
f( 0 )f( 1 )f( n + 2 )= 0= 1= f( n + 1 ) + f( n ), н ≥ 0
ff( n )f( n + 1 )
Зауважте, що, натомість, запам'ятовування є поряд із марними для таких алгоритмів, як сортування злиття: зазвичай декілька (якщо такі є) часткові списки однакові, а перевірки рівності - дорогі (сортування лише трохи дорожче!)
У практичних втіленнях спосіб зберігання результатів має велике значення для продуктивності. Використання хеш-таблиць може бути очевидним вибором, але може порушити місцевість. Якщо ваші параметри невід'ємні цілі числа, масиви є природним вибором, але можуть спричинити величезні накладні витрати на пам'ять, якщо ви використовуєте лише деякі записи. Тому запам'ятовування - це компроміс між ефектом і вартістю; чи окупається це, залежить від конкретного сценарію.
Динамічне програмування - це зовсім інший звір. Це застосовно до проблем із майном, яке
- його можна розділити на підпрограми (можливо, більш ніж одним способом),
- ці підпрограми можна вирішити самостійно,
- (оптимальні) рішення цих підпроблем можуть поєднуватися з (оптимальними) рішеннями вихідної задачі та
- підпроблеми мають однакову властивість (або тривіальні).
Це зазвичай (неявно) мається на увазі, коли люди посилаються на Принцип оптимальності Беллмана .
Тепер це лише описує клас проблем, які можуть бути виражені певним видом рекурсії. Оцінка цих питань (часто) ефективна, оскільки запам'ятовування може бути застосоване з великим ефектом (див. Вище); Зазвичай менші підпрограми виникають як частина багатьох більших проблем. Популярні приклади включають відстань редагування та алгоритм Беллмана-Форда .