f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)
ลองออนไลน์!
แนวทางที่แตกต่าง
นับตั้งแต่ฉันโพสต์ความท้าทายนี้ฉันพยายามหาวิธีแก้ปัญหาแบบเรียกซ้ำสำหรับปัญหานี้ ในขณะที่ฉันไม่ได้ใช้อะไรมากไปกว่าปากกาและกระดาษฉันก็สามารถเปลี่ยนสูตรการเล่นกอล์ฟให้กลายเป็นปัญหาเชิงปฏิบัติได้ - อย่างน้อยก็สำหรับคำจำกัดความทางปฏิบัติบางอย่าง - ซึ่งทำให้การวิเคราะห์ง่ายขึ้น
ลองนึกภาพเกมโชว์ที่มีผู้สมัครk + mที่ทำงานดังนี้
ในรอบที่ 1 ผู้สมัครทุกคนจะต้องทำภารกิจให้สำเร็จให้เร็วที่สุดเท่าที่จะทำได้ kสมัครที่ทํางานที่เร็วที่สุดชนะ1 k $ (หนึ่ง kilodollar) แต่ละและล่วงหน้าไปรอบ 3
ในรอบ 2, ม.ที่เหลือผู้สมัครที่ได้รับโอกาสครั้งที่สองที่จะเข้าร่วมอื่น ๆk ผู้สมัครแต่ละคนจะถูกถามคำถาม หากพวกเขาตอบคำถามได้อย่างถูกต้องพวกเขาชนะ1 k $และเลื่อนไปที่รอบที่ 3 อย่างไรก็ตามหากพวกเขาไม่ตอบคำถามพวกเขาจะถูกคัดออกจากเกม ซึ่งหมายความว่ารอบที่ 3 จะมีผู้สมัครระหว่างkและk + mขึ้นอยู่กับจำนวนที่สามารถตอบคำถามได้
รอบที่ 3 ประกอบด้วยม.การแข่งขันมากขึ้นว่ามีความคล้ายคลึงกับรอบที่ 1 ในการประกวดในแต่ละผู้เข้าร่วมจะต้องบรรลุงานบางอย่าง ต่างจากรอบที่ 1 ผู้สมัครเพียงคนเดียวเท่านั้นที่ได้รับรางวัล แต่ผู้สมัครทุกคนจะได้เข้าร่วมในการแข่งขันครั้งต่อไป การแข่งขันแต่ละครั้งจะจ่ายเงินมากเป็นสองเท่าของการแข่งขันก่อนหน้านั้น คนแรกที่จ่าย2 k $และสุดท้าย2 เมตร k $
โปรดทราบว่าเนื่องจากรางวัลทั้งหมดเป็นพลังของทั้งสองการรู้จำนวนเงินรางวัลที่ผู้สมัครได้รับหมายความว่าเรารู้ว่าพวกเขาก้าวเข้าสู่รอบที่ 3 และการแข่งขันรอบที่ 3 ที่พวกเขาชนะ
สมมติว่าคุณกำลังดูรายการเกมและรอบที่ 1 สิ้นสุดลงแล้วดังนั้นคุณจึงรู้ว่าผู้สมัครkคนใดถึงรอบที่ 3 และm แล้วผู้สมัครจะยังคงติดอยู่ในรอบที่ 2 ในหลายวิธีที่สามารถเงินรางวัลที่เหลือจะกระจาย?
เมื่อเราทราบว่าของรอบที่สองของม.ผู้สมัครที่ได้ก้าวเข้าสู่รอบ 3 มันเป็นเรื่องง่ายในการคำนวณผลลัพธ์ที่เป็นไปในสถานการณ์นี้โดยเฉพาะ หากผู้สมัครjล่วงหน้ามีk + jรวมผู้สมัครในรอบ 3 และทำให้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 k $ $ คุณไม่มีข้อมูลอื่นใดแม้แต่เงินรางวัลที่ผู้สมัครได้รับรวมทั้งหมด เงินรางวัลที่เหลือสามารถกระจายได้กี่วิธี?
หากผู้ชนะคือหนึ่งในผู้สมัครmในรอบที่ 2 ตอนนี้พวกเราต้องก้าวเข้าสู่รอบที่3แล้ว ดังนั้นเราจึงมีผู้สมัครk + 1 ได้ในรอบที่ 3 แต่มีเพียงm - 1ผู้สมัครในรอบที่ 2 เนื่องจากเรารู้ว่าผู้ชนะการประกวดครั้งล่าสุดมีเพียงการประกวดm - 1 ที่มีผลลัพธ์ที่ไม่แน่นอนดังนั้นจึงมีg (m - 1, k + 1)ผลลัพธ์ที่เป็นไปได้
หากผู้ชนะคือหนึ่งในผู้สมัครkที่ข้ามรอบที่ 2 การคำนวณจะค่อนข้างยุ่งยาก เมื่อก่อนมีเหลือเพียงm - 1รอบ แต่ตอนนี้เรายังมีผู้สมัครkในรอบที่ 3 และmผู้สมัครในรอบที่ 2 เนื่องจากจำนวนผู้สมัครรอบที่ 2 และจำนวนการแข่งขันรอบที่ 3 แตกต่างกันผลลัพธ์ที่เป็นไปได้ไม่สามารถ ได้รับการคำนวณด้วยการภาวนาที่เรียบง่ายของกรัม อย่างไรก็ตามหลังจากที่ผู้สมัครรอบ 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ผู้สมัครที่จะได้รับรางวัลชนะเลิศผลจะต้องตรงกับกรัม (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