Nếu bạn chỉ tìm cách tăng tốc thuật toán đệ quy của mình, thì việc ghi nhớ có thể là đủ. Đây là kỹ thuật lưu trữ kết quả của các cuộc gọi chức năng để các cuộc gọi trong tương lai có cùng tham số có thể sử dụng lại kết quả. Điều này được áp dụng nếu (và chỉ khi) chức năng của bạn
- không có tác dụng phụ và
- không chỉ phụ thuộc vào các tham số của nó (tức là không phụ thuộc vào một số trạng thái).
Nó sẽ giúp bạn tiết kiệm thời gian nếu (và chỉ khi) hàm được gọi với cùng một tham số lặp đi lặp lại. Các ví dụ phổ biến bao gồm định nghĩa đệ quy của các số Fibonacci, nghĩa là
f( 0 )f( 1 )f( n + 2 )= 0= 1= f( n + 1 ) + f( n ), n ≥ 0
ff( n )f( n + 1 )
Lưu ý rằng, ngược lại, sự phân biệt bên cạnh vô dụng đối với các thuật toán như sắp xếp hợp nhất: thường là một vài danh sách một phần (nếu có) giống hệt nhau và kiểm tra đẳng thức rất tốn kém (sắp xếp chỉ tốn kém hơn một chút!).
Trong triển khai thực tế, cách bạn lưu trữ kết quả là rất quan trọng đối với hiệu suất. Sử dụng bảng băm có thể là sự lựa chọn rõ ràng, nhưng có thể phá vỡ địa phương. Nếu tham số của bạn là số nguyên không âm, mảng là một lựa chọn tự nhiên nhưng có thể gây ra chi phí bộ nhớ lớn nếu bạn chỉ sử dụng một số mục. Do đó, sự sành sỏi là sự đánh đổi giữa hiệu quả và chi phí; cho dù nó trả hết tùy thuộc vào kịch bản cụ thể của bạn.
Lập trình động là một con thú hoàn toàn khác. Nó được áp dụng cho các vấn đề với tài sản mà
- nó có thể được phân vùng thành các bài toán con (có thể theo nhiều cách),
- những vấn đề con có thể được giải quyết độc lập,
- Các giải pháp (tối ưu) của các bài toán con này có thể được kết hợp với các giải pháp (tối ưu) của bài toán ban đầu và
- các bài toán con có cùng thuộc tính (hoặc là tầm thường).
Điều này thường (ngầm) ngụ ý khi mọi người gọi Nguyên tắc Tối ưu của Bellman .
Bây giờ, điều này chỉ mô tả một lớp các vấn đề có thể được thể hiện bằng một loại đệ quy nhất định. Đánh giá những cái đó là (thường) hiệu quả bởi vì sự phân biệt có thể được áp dụng cho hiệu quả lớn (xem ở trên); thông thường, các bài toán con nhỏ hơn xảy ra như là một phần của nhiều vấn đề lớn hơn. Các ví dụ phổ biến bao gồm khoảng cách chỉnh sửa và thuật toán Bellman-Ford .