Xem xét một hàm f (x, y):Việc sử dụng các ngôn ngữ chức năng có giúp chống lại các giá trị tính toán nhiều lần không?
f(x,0) = x*x;
f(0,y) = y*(y + 1);
f(x,y) = f(x,y-1) + f(x-1,y);
Nếu một cố gắng thực hiện điều đó một cách đệ quy trong một số ngôn ngữ như C++ ông sẽ gặp phải một vấn đề.
Giả sử hàm này được gọi đầu tiên với x = x0
và y = y0
. Sau đó, đối với bất kỳ cặp nào (x, y) trong đó 0 <= x < x0
và 0 <= y < y0
giá trị trung gian sẽ được tính nhiều lần - các cuộc gọi đệ quy sẽ tạo thành một cây lớn trong đó nhiều lá thực tế sẽ chứa cùng một cặp (x, y). Đối với các cặp (x, y) trong đó x và y đều gần với 0 giá trị sẽ được tính nhiều lần.
Ví dụ, tôi đã thử nghiệm một chức năng tương tự được thực hiện trong C++ - cho x=20
và y=20
tính toán của nó mất khoảng 4 giờ (có, bốn giờ Trái đất!).
Rõ ràng việc triển khai có thể được viết lại theo cách tính toán lặp lại không xảy ra - hoặc lặp lại hoặc với bảng bộ nhớ cache.
Câu hỏi đặt ra là: liệu các ngôn ngữ chức năng có thực hiện tốt hơn và tránh tính toán lặp lại khi triển khai một hàm như trên đệ quy không?
Nó phụ thuộc vào việc thực hiện. Đây không phải là một cái gì đó vốn đã nhanh hơn trong các ngôn ngữ chức năng. Điều đó nói rằng, tôi nghĩ rằng nó có thể thực hiện một tối ưu hóa như vậy trong một ngôn ngữ chức năng, nhưng tôi không biết các chi tiết cụ thể vì vậy tôi sẽ không đưa ra một câu trả lời cụ thể. –