Tôi đang xem Problem thirty one trên Project Euler, hỏi có bao nhiêu cách khác nhau để tạo ra £ 2 bằng cách sử dụng số tiền 1p, 2p, 5p, 10p, 20p, 50p, £ 1 (100p) và £ 2 (200p).Lập trình động trong mô hình chức năng
Có nhiều giải pháp đệ quy như thế này ở Scala (tín dụng cho Pavel Fatin)
def f(ms: List[Int], n: Int): Int = ms match {
case h :: t =>
if (h > n) 0 else if (n == h) 1 else f(ms, n - h) + f(t, n)
case _ => 0
}
val r = f(List(1, 2, 5, 10, 20, 50, 100, 200), 200)
và mặc dù nó chạy đủ nhanh, nó tương đối hiệu quả, gọi f
chức năng khoảng 5,6 triệu lần.
tôi thấy giải pháp của người khác trong Java được lập trình tự động (tín dụng để wizeman từ Bồ Đào Nha)
final static int TOTAL = 200;
public static void main(String[] args) {
int[] coins = {1, 2, 5, 10, 20, 50, 100, 200};
int[] ways = new int[TOTAL + 1];
ways[0] = 1;
for (int coin : coins) {
for (int j = coin; j <= TOTAL; j++) {
ways[j] += ways[j - coin];
}
}
System.out.println("Result: " + ways[TOTAL]);
}
Đây là hiệu quả hơn và vượt qua các vòng trong chỉ 1220 lần.
Trong khi tôi rõ ràng có thể dịch nguyên văn này ít nhiều thành Scala khi sử dụng các đối tượng Array
, có cách chức năng thành ngữ để thực hiện điều này bằng cấu trúc dữ liệu không thay đổi được không?
Tôi đã cố gắng và trở nên khó khăn khi cố gắng đệ quy cập nhật List
trước khi quyết định tôi có thể đang tiếp cận nó theo cách sai.
tôi nhìn vào phiên bản Scala trong 1 phút và có thể nói như thế nào nó làm việc. Nhìn vào Java trong 5 phút, và tôi vẫn không biết nó hoạt động như thế nào. Đối với tôi một ví dụ tốt cho thấy chức năng không phức tạp hơn mệnh lệnh. – huynhjl
@huynhjl Nhưng bên cạnh nhìn vào một algortihm chức năng và imerative, bạn đang đồng thời nhìn vào một thuật toán kinh điển và tối ưu hóa. – ziggystar