f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)
इसे ऑनलाइन आज़माएं!
एक अलग दृष्टिकोण
जब से मैंने इस चुनौती को पोस्ट किया है, मैंने इस समस्या के पुनरावर्ती समाधान के साथ आने की कोशिश की। जब मैं कलम और कागज के अलावा और कुछ भी उपयोग करने में विफल रहा, तो मैंने गोल्फ को एक व्यावहारिक समस्या में परिणत करने में कामयाबी हासिल की - कम से कम व्यावहारिक की कुछ परिभाषाओं के लिए - जिससे विश्लेषण करना आसान हो गया।
K + m उम्मीदवारों के साथ एक गेम शो की कल्पना करें जो निम्नानुसार काम करता है।
राउंड 1 में, सभी उम्मीदवारों को जितनी जल्दी हो सके एक निश्चित कार्य पूरा करना होगा। कश्मीर उम्मीदवारों उस कार्य को सबसे तेजी से पूरा जीतने 1 कश्मीर $ (एक kilodollar) दौर 3 करने के लिए प्रत्येक और अग्रिम।
दौर 2 में, मीटर शेष उम्मीदवारों अन्य शामिल होने के लिए एक दूसरा मौका मिलता है कश्मीर । प्रत्येक उम्मीदवार से एक प्रश्न पूछा जाता है। यदि वे प्रश्न का सही उत्तर देते हैं, तो वे 1 k $ जीतते हैं और 3 राउंड तक आगे बढ़ते हैं। हालाँकि, यदि वे प्रश्न का उत्तर देने में विफल रहते हैं, तो उन्हें खेल से हटा दिया जाता है। इसका मतलब है कि राउंड 3 में k और k + m उम्मीदवारों के बीच होगा, जो इस बात पर निर्भर करता है कि कितने लोग अपने सवालों के जवाब दे सकते हैं।
राउंड 3 में एम अधिक प्रतियोगिताएं शामिल हैं जो कि राउंड 1 के समान हैं। प्रत्येक प्रतियोगिता में, प्रतिभागियों को एक निश्चित कार्य पूरा करना होता है। राउंड 1 के विपरीत, केवल एक उम्मीदवार को पुरस्कार मिलता है, लेकिन सभी उम्मीदवारों को अगली प्रतियोगिता में भाग लेने के लिए मिलता है। प्रत्येक प्रतियोगिता इससे पहले की प्रतियोगिता से दोगुना भुगतान करती है; पहले एक भुगतान करता है 2 कश्मीर $ और पिछले एक 2 मीटर कश्मीर $ ।
ध्यान दें कि चूंकि सभी पुरस्कार दो की शक्तियां हैं, यह जानते हुए कि एक उम्मीदवार ने कितनी पुरस्कार राशि अर्जित की है, हम जानते हैं कि क्या वे राउंड 3 में उन्नत हैं और राउंड 3 के कौन से मुकाबले जीते हैं।
मान लें कि गेम शो और दौर 1 पहले से ही खत्म हो गया है देख रहे हैं, तो आप जानते हैं जो कश्मीर उम्मीदवारों को पहले से ही दौर तक पहुँच चुके हैं 3 और जो मीटर उम्मीदवारों अभी भी दौर 2. में फंस रहे हैं कि कितने तरीकों से शेष पुरस्कार राशि वितरित किया जा सकता है?
एक बार जब हम यह जान लेते हैं कि दूसरे दौर के कौन से मी अभ्यर्थी राउंड 3 में आगे बढ़े हैं, तो इस विशिष्ट परिदृश्य के लिए संभावित परिणामों की गणना करना आसान है। यदि j उम्मीदवार आगे बढ़ते हैं, तो राउंड 3 में k + j कुल उम्मीदवार हैं, और इस प्रकार प्रत्येक प्रतियोगिता के लिए k + j संभावित परिणाम हैं। राउंड 3 में मी व्यक्तिगत प्रतियोगिताओं के साथ , यह सभी मी प्रतियोगिताओं के लिए (k + j) मी परिणाम बनाता है ।
अब j , 0 और m के बीच कोई भी मान ले सकता है , जिसके आधार पर उम्मीदवार राउंड में सही उत्तर देते हैं। 2. j के प्रत्येक फिक्स वैल्यू के लिए , j उम्मीदवारों के लिए m C j भिन्न संयोजन हैं जो राउंड के लिए उन्नत हो सकते हैं। 3. यदि हम कॉल करते हैं के लिए संभावित परिणामों की कुल संख्या कश्मीर 3 उम्मीदवारों दौर और मीटर दौर 2 उम्मीदवारों जी (एम, कश्मीर) , हम निम्न सूत्र मिलता है।
यदि हम k = 1 को ठीक करते हैं, तो हमें निम्नलिखित विशेष मामले मिलते हैं, जो मूल समस्या को हल करने के लिए हमारे नए दृष्टिकोण का गठन करते हैं।
एक पुनरावर्ती सूत्र
अब, मान लें कि आप 1 राउंड के बाद विज्ञापनों के दौरान सो गए थे, और केवल समय में जागकर यह देखने के लिए कि राउंड 3 की आखिरी प्रतियोगिता किसने जीती और इस तरह 2 मीटर k $ का भव्य पुरस्कार मिला । आपके पास कोई अन्य जानकारी नहीं है, भले ही उम्मीदवार को कुल कितनी पुरस्कार राशि मिली हो। शेष पुरस्कार राशि को कितने तरीकों से वितरित किया जा सकता है?
यदि विजेता राउंड 2 के मी उम्मीदवारों में से एक था , तो हम पहले से ही अब वे राउंड 3 में आगे बढ़ चुके हैं । इस प्रकार, हमारे पास राउंड 3 में प्रभावी रूप से k + 1 अभ्यर्थी हैं, लेकिन राउंड में केवल m - 1 अभ्यर्थी हैं। चूंकि हम अंतिम प्रतियोगिता के विजेता को जानते हैं, इसलिए केवल m - 1 कॉन्टेस्ट अनिश्चित परिणामों के साथ हैं, इसलिए g (m) हैं - 1, के + 1) संभावित परिणाम।
यदि विजेता राउंड 2 को छोड़ देने वाले k उम्मीदवारों में से एक है , तो गणना थोड़ी पेचीदा हो जाती है। पहले के रूप में, वहाँ केवल हैं मीटर - 1 राउंड छोड़ दिया है, लेकिन अब हम अभी भी है कश्मीर दौर 3 और उम्मीदवारों मीटर दौर 2 में उम्मीदवारों दौर 2 उम्मीदवारों की संख्या और दौर 3 प्रतियोगिताओं की संख्या के बाद से कर रहे हैं अलग, संभावित परिणामों नहीं कर सकते जी के एक साधारण आह्वान के साथ गणना की जाएगी । हालाँकि, पहले राउंड के बाद 2 उम्मीदवार ने उत्तर दिया है - सही या गलत - राउंड 2 उम्मीदवारों की संख्या एक बार फिर मी - 1 राउंड 3 प्रतियोगिता से मेल खाती है । यदि उम्मीदवार आगे बढ़ते हैं, तो k + 1 राउंड 3 उम्मीदवार होते हैं और इस प्रकार g (m - 1, k + 1)संभावित नतीजे; यदि उम्मीदवार को हटा दिया जाता है, तो राउंड 3 उम्मीदवारों की संख्या k पर बनी रहती है और जी (m - 1, k) संभावित परिणाम होते हैं। चूंकि उम्मीदवार या तो अग्रिम या नहीं, वहाँ जी (एम - 1, के + 1) + जी (एम - 1, के) इन दो मामलों के संयोजन के संभावित परिणाम हैं।
अब, यदि हम सभी k + m उम्मीदवारों के लिए संभावित परिणाम जोड़ते हैं जो भव्य पुरस्कार जीत सकते थे, तो परिणाम जी (m, k) से मेल खाना चाहिए । कर रहे हैं मीटर दौर है कि करने के लिए नेतृत्व 2 प्रतियोगियों जी (एम - 1, k + 1) संभावित प्रत्येक परिणामों, और k दौर 3 प्रतियोगियों कि करने के लिए नेतृत्व ग्राम (मीटर - 1, k + 1) + g (एम - 1, ट) लोगों को। संक्षेप में, हमें निम्नलिखित पहचान मिलती है।
साथ में बेस केस
ये दो सूत्र पूरी तरह से फ़ंक्शन जी को चिह्नित करते हैं ।
एक गोल्फ कार्यान्वयन
जबकि
g=lambda m,k=1:0**m or(m+k)*g(m-1,k+1)+k*g(m-1,k)
(49 बाइट्स, 10**m
पैदावार एक बार मी 0 पर गिरता है ) या भी
g=lambda m,k=1:m<1 or(m+k)*g(m-1,k+1)+k*g(m-1,k)
(48 बाइट्स, रिटर्न 1 के बजाय ट्रू ) वैध समाधान होगा, अभी भी बाइट्स बचाए जाने हैं।
यदि हम एक फंक्शन एफ को परिभाषित करते हैं जो पहले तर्क के रूप में 2 उम्मीदवारों की संख्या मी के बजाय राउंड 1 उम्मीदवारों की संख्या n लेता है, अर्थात
हमें पुनरावर्ती सूत्र मिलता है
बेस केस के साथ
अंत में, हमारे पास है
इसलिए पायथन कार्यान्वयन
f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)
( k/n
पैदावार 1 बार n = k ) 1-आधारित अनुक्रमण के साथ कार्य को हल करता है।