f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)
Спробуйте в Інтернеті!
Інший підхід
З тих пір, як я опублікував це завдання, я намагався придумати рекурсивне рішення цієї проблеми. Хоча я не зміг використати нічого, крім ручки та паперу, мені вдалося перетворити формулу для гольфу на практичну проблему - принаймні, для певних практичних визначень - що полегшило їх аналіз.
Уявіть ігрове шоу з кандидатами k + m, яке працює наступним чином.
У першому раунді всі кандидати повинні виконати певне завдання якомога швидше. В K кандидати які виконують завдання швидше за все виграти 1 K $ (один kilodollar) кожен і просування в 3 -му раунді.
У другому турі m, що залишилися кандидати, отримують другий шанс приєднатися до іншого k . Кожному кандидату задається питання. Якщо правильно відповісти на питання, вони виграють 1 к $ і переходять до третього раунду. Однак, якщо вони не зможуть відповісти на питання, вони виключаються з гри. Це означає, що 3 раунд матиме кандидатів від k до k + m , залежно від того, скільки може відповісти на їх запитання.
3 раунд складається з m більше змагань, схожих на раунд 1. У кожному конкурсі учасники повинні виконати певне завдання. На відміну від першого туру, лише один кандидат отримує приз, але всі кандидати отримують участь у наступному конкурсі. Кожен конкурс платить вдвічі більше, ніж змагання перед ним; перший платить 2 k $, а останній 2 m k $ .
Зауважте, що оскільки всі призи - це сили на дві, знаючи, скільки призових грошей заробив кандидат, ми знаємо, чи перейшли до 3-го туру і в якому з конкурсів 3-го туру вони виграли.
Припустимо , що ви дивитеся гри шоу і раунд 1 вже закінчився, так що ви знаєте , які K кандидати вже досягли раунд 3 і який м кандидати все ще застрягли в круглих 2. Скількома способами можна розподілити залишилися призові гроші?
Після того, як ми знаємо , який з другого раунду м кандидатів висували в 3 -му раунді, легко розрахувати можливі результати для цього конкретного сценарію. Якщо j кандидати висуваються, то в 3 раунді є всього k + j кандидатів, і таким чином k + j можливі результати для кожного конкурсу. З m індивідуальних змагань у 3 раунді це робить (k + j) m результатами для всіх m змагань.
Тепер j може приймати будь-яке значення від 0 до m , залежно від того, які кандидати відповідають правильно в раунді 2. Для кожного виправленого значення j існує m C j різних комбінацій j кандидатів, які могли б перейти до раунду 3. Якщо ми зателефонуємо загальну кількість можливих результатів для k туру 3 кандидата та m туру 2 кандидатів g (m, k) , отримаємо наступну формулу.
Якщо ми зафіксуємо k = 1 , отримаємо такий спеціальний випадок, який є нашим новим підходом до вирішення вихідної проблеми.
Рекурсивна формула
А тепер припустимо, що ви заснули під час рекламних роликів після 1 раунду, і прокинулися якраз вчасно, щоб побачити, хто виграв останній конкурс 3 раунду і, таким чином, великий приз у 2 млн. Доларів . Ви не маєте жодної іншої інформації, навіть того, скільки призових коштів виграв цей кандидат в цілому. Скількома способами можна розподілити решту грошових призів?
Якщо переможець був одним із m кандидатів у 2 раунді, ми вже тепер, коли вони, мабуть, перейшли до 3-го туру . Таким чином, ми фактично маємо k + 1 кандидатів у 3 раунді, але лише m - 1 кандидат у другому раунді. Оскільки ми знаємо переможця останнього конкурсу, є лише m - 1 конкурсів із невизначеними результатами, тому є g (m - 1, k + 1) можливі результати.
Якщо переможець є одним із k кандидатів, які пропустили 2 раунд, обчислення стає трохи складніше. Як і раніше, залишилось лише m - 1 раунд, але тепер у нас все ще k кандидатів у 3 турі та m кандидатів у другому раунді. Оскільки кількість кандидатів у 2 турі та кількість конкурсів у 3 раунді різні, можливі результати не можуть обчислюється простим викликом g . Однак після першого туру 2 кандидат відповів - правильно чи неправильно - кількість кандидатів у 2 раунді знову відповідає m - 1 туру 3 конкурсу. Якщо кандидат просувається, є k + 1 раунд 3 кандидатів, і таким чином g (m - 1, k + 1)можливі результати; якщо кандидат виключений, кількість кандидатів у 3 раунді залишається на k і є g (m - 1, k) можливих результатів. Оскільки кандидат просувається чи ні, то можливі результати g (m - 1, k + 1) + g (m - 1, k), поєднуючи ці два випадки.
Тепер, якщо додати потенційні результати для всіх k + m кандидатів, які могли б виграти головний приз, результат повинен відповідати g (m, k) . Існує m учасників 2 туру, які призводять до g (m - 1, k + 1) потенційних результатів кожен, і k раунді 3 учасників, які призводять до g (m - 1, k + 1) + g (m - 1, k) ті. Підсумовуючи, ми отримуємо таку тотожність.
Разом з базовим корпусом
ці дві формули повністю характеризують функцію g .
Гофрована реалізація
Поки
g=lambda m,k=1:0**m or(m+k)*g(m-1,k+1)+k*g(m-1,k)
(49 байт, 0**m
вихід 1 раз m падає на 0 ) або навіть
g=lambda m,k=1:m<1 or(m+k)*g(m-1,k+1)+k*g(m-1,k)
(48 байт, повертає True замість 1 ) були б дійсними рішеннями, все ж байти зберігаються.
Якщо ми визначимо функцію f, яка приймає число n кандидатів у раунд 1 замість числа m кандидатів 2 раунду як перший аргумент, тобто
ми отримуємо рекурсивну формулу
з базовим корпусом
Нарешті, у нас є
тому реалізація Python
f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)
( k/n
виходить 1 раз n = k ) розв'язує задану задачу за допомогою індексації на основі 1.