f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)
Hãy thử trực tuyến!
Một cách tiếp cận khác
Kể từ khi tôi đăng thử thách này, tôi đã cố gắng đưa ra một giải pháp đệ quy cho vấn đề này. Trong khi tôi thất bại trong việc sử dụng không gì khác ngoài bút và giấy, tôi đã xoay sở để biến công thức thành golf thành một vấn đề thực tế - ít nhất là đối với một số định nghĩa thực tế - giúp cho việc phân tích dễ dàng hơn.
Hãy tưởng tượng một game show với các ứng cử viên k + m hoạt động như sau.
Ở vòng 1, tất cả các ứng viên phải hoàn thành một nhiệm vụ nhất định nhanh nhất có thể. Các ứng cử viên k hoàn thành nhiệm vụ nhanh nhất giành được 1 k $ (một kilodollar) và tiến vào vòng 3.
Trong vòng 2, m ứng cử viên còn lại có được một cơ hội thứ hai để tham gia khác k . Mỗi ứng viên được hỏi một câu hỏi. Nếu họ trả lời đúng câu hỏi, họ thắng 1 k $ và tiến vào vòng 3. Tuy nhiên, nếu họ không trả lời được câu hỏi, họ sẽ bị loại khỏi trò chơi. Điều này có nghĩa là vòng 3 sẽ có giữa các ứng cử viên k và k + m , tùy thuộc vào số lượng người có thể trả lời câu hỏi của họ.
Vòng 3 bao gồm m nhiều cuộc thi tương tự như vòng 1. Trong mỗi cuộc thi, người tham gia phải hoàn thành một nhiệm vụ nhất định. Không giống như vòng 1, chỉ có một thí sinh nhận được giải thưởng, nhưng tất cả các thí sinh đều được tham gia cuộc thi tiếp theo. Mỗi cuộc thi trả gấp đôi so với cuộc thi trước đó; người đầu tiên trả 2 k $ và người cuối cùng 2 m k $ .
Lưu ý rằng vì tất cả các giải thưởng là sức mạnh của hai người, nên biết một ứng cử viên kiếm được bao nhiêu tiền có nghĩa là chúng tôi biết nếu họ tiến vào vòng 3 và cuộc thi nào của vòng 3 họ đã giành chiến thắng.
Giả sử bạn đang xem các chương trình trò chơi và vòng 1 đã kết thúc, để bạn biết mà k ứng viên đã đạt vòng 3 và đó m thí sinh vẫn mắc kẹt trong vòng 2. Có bao nhiêu cách tiền thưởng còn lại có thể được phân phối?
Một khi chúng ta biết được của vòng thứ hai của m thí sinh đã lọt vào vòng 3, thật dễ dàng để tính toán các kết quả có thể cho kịch bản cụ thể này. Nếu ứng viên j tiến lên, có tổng số k + j ứng viên vào vòng 3, và do đó k + j có thể đạt được kết quả cho mỗi cuộc thi. Với m cuộc thi cá nhân ở vòng 3, điều này tạo ra (k + j) m kết quả cho tất cả các cuộc thi m .
Bây giờ, j có thể nhận bất kỳ giá trị nào trong khoảng từ 0 đến m , tùy thuộc vào ứng cử viên nào trả lời đúng trong vòng 2. Với mỗi giá trị sửa lỗi của j , có m C j kết hợp khác nhau của các ứng cử viên j có thể tiến đến vòng 3. Nếu chúng tôi gọi tổng số kết quả có thể có đối với k thí sinh vòng 3 và m vòng 2 thí sinh g (m, k) , chúng ta có được công thức sau.
Nếu chúng tôi sửa k = 1 , chúng tôi sẽ nhận được trường hợp đặc biệt sau, cấu thành cách tiếp cận mới của chúng tôi để giải quyết vấn đề ban đầu.
Một công thức đệ quy
Bây giờ, giả sử rằng bạn đã ngủ thiếp đi trong các quảng cáo sau vòng 1, và thức dậy đúng lúc để xem ai là người chiến thắng trong cuộc thi cuối cùng của vòng 3 và do đó giải thưởng lớn là 2 m k $ . Bạn không có bất kỳ thông tin nào khác, thậm chí tổng số tiền mà thí sinh đó đã giành được. Có bao nhiêu cách giải thưởng tiền còn lại có thể được phân phối?
Nếu người chiến thắng là một trong những m thí sinh của vòng 2, chúng ta đã bây giờ mà họ phải tiến đến vòng 3 . Do đó, chúng tôi thực sự có k + 1 thí sinh ở vòng 3, nhưng chỉ có m - 1 thí sinh ở vòng 2. Vì chúng tôi biết người chiến thắng trong cuộc thi cuối cùng, chỉ có m - 1 cuộc thi có kết quả không chắc chắn, nên có g (m - 1, k + 1) kết quả có thể xảy ra.
Nếu người chiến thắng là một trong những ứng cử viên k bỏ qua vòng 2, phép tính trở nên khó khăn hơn một chút. Như trước đây, chỉ còn lại m - 1 vòng, nhưng hiện tại chúng tôi vẫn có k thí sinh ở vòng 3 và m thí sinh ở vòng 2. Vì số thí sinh vòng 2 và số vòng thi 3 khác nhau, kết quả có thể xảy ra được tính toán với một lời gọi đơn giản của g . Tuy nhiên, sau khi thí sinh vòng 2 đã trả lời - đúng hay sai - số thí sinh vòng 2 một lần nữa phù hợp với các cuộc thi m - 1 vòng 3. Nếu ứng viên tiến lên, có k + 1 vòng 3 ứng viên và do đó g (m - 1, k + 1)kết quả có thể xảy ra; nếu ứng cử viên bị loại, số lượng thí sinh vòng 3 vẫn ở mức k và có kết quả có thể là g (m - 1, k) . Vì ứng viên có tiến bộ hay không, nên có kết quả có thể là g (m - 1, k + 1) + g (m - 1, k) kết hợp hai trường hợp này.
Bây giờ, nếu chúng tôi thêm kết quả tiềm năng cho tất cả các ứng cử viên k + m có thể giành được giải thưởng lớn, kết quả phải phù hợp với g (m, k) . Có m thí sinh vòng 2 dẫn đến kết quả tiềm năng g (m - 1, k + 1) và k thí sinh vòng 3 dẫn đến g (m - 1, k + 1) + g (m - 1, k) những cái. Tổng kết, chúng tôi nhận được danh tính sau đây.
Cùng với trường hợp cơ sở
hai công thức này đặc trưng cho hàm g hoàn toàn.
Một triển khai golf
Trong khi
g=lambda m,k=1:0**m or(m+k)*g(m-1,k+1)+k*g(m-1,k)
(49 byte, 0**m
mang lại 1 khi m giảm xuống 0 ) hoặc thậm chí
g=lambda m,k=1:m<1 or(m+k)*g(m-1,k+1)+k*g(m-1,k)
(48 byte, trả về True thay vì 1 ) sẽ là các giải pháp hợp lệ, vẫn còn các byte được lưu.
Nếu chúng ta xác định hàm f lấy số n của thí sinh vòng 1 thay vì số m của thí sinh vòng 2 làm đối số đầu tiên, nghĩa là
chúng ta có được công thức đệ quy
với trường hợp cơ sở
Cuối cùng, chúng ta có
Vì vậy, việc thực hiện Python
f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)
( k/n
mang lại 1 lần n = k ) giải quyết nhiệm vụ trong tay với lập chỉ mục dựa trên 1.