f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)
Çevrimiçi deneyin!
Farklı bir yaklaşım
Bu mücadeleyi yayınladığımdan beri, bu soruna tekrarlı bir çözüm bulmaya çalıştım. Kalem ve kağıttan başka bir şey kullanmakta başarısız olmama rağmen, formülü golf oynamak için pratik bir probleme dönüştürmeyi başardım - en azından belirli pratik tanımlamalar için - bu da analiz etmeyi kolaylaştırdı.
Aşağıdaki gibi çalışan k + m adaylarıyla bir oyun gösterisi hayal edin .
1. rauntta, tüm adayların mümkün olduğu kadar hızlı bir şekilde belirli bir görevi başarmaları gerekiyor. K görevi en hızlı başarmak adayların kazanmak 1 k $ (bir kilodollar) yuvarlak 3'e her ve peşin.
2. turda, kalan m adayları diğer k'ya katılmak için ikinci bir şans elde eder . Her aday bir soru sorulur. Soruyu doğru cevaplarlarsa, 1 k $ kazanırlar ve 3. turu ilerlerler. Ancak soruyu cevaplayamazlarsa, oyundan çıkarılırlar. Bu, 3. turun k ve k + m adayları arasında kaç kişinin sorularına cevap verebileceğine bağlı olacağı anlamına geliyor .
3. Tur oluşur m her yarışmada 1. yuvarlak benzeyen daha fazla yarışmalar, katılımcılar belirli bir görevi tamamlamak zorunda. 1. raunttan farklı olarak, sadece bir aday bir ödül alır, ancak tüm adaylar bir sonraki yarışmaya katılabilir. Her yarışma, bir önceki yarışmadan iki kat daha fazla ödeme yapar; ilki 2 k $ , sonuncusu 2 m k $ öder .
Tüm ödüllerin ikisinin gücü olduğundan, bir adayın ne kadar para kazanacağını bilmek, 3. turda ilerleyip ilerlemeyeceğini ve 3. turdaki yarışmalardan hangisinin kazandığını bilmek anlamına gelir.
Oyun şovunu izlediğinizi varsayalım ve 1. raunt zaten bitti, yani hangi k adayın 3. rauntta zaten ulaştığını ve hangi rauntın hala 2. raundda kaldığını biliyorsunuz . Kalan ödül parası kaç şekilde dağıtılabilir?
İkinci yuvarlaklık hangi öğrendiğinizde m yuvarlak 3'e gelişmiş adaylar, bu belirli senaryo için olası sonuçlarını hesaplamak kolaydır. Eğer j adayları ilerlerse, 3. turda toplam k + j adayları olur ve bu nedenle her yarışma için k + j sonuçları olasıdır. İle m yuvarlak 3'te bireysel yarışmalar, bu markaların (k + j) m herkes için çıktıları m yarışmaları.
Şimdi, j arasındaki herhangi bir değer alabilir 0 ve m , hangi bağlı adayların her düzeltme değeri için yuvarlak 2. doğru cevap j vardır m C j farklı kombinasyonlar j biz ararsanız yuvarlak 3'e gelişmiş olabilirdi adaylar k tur 3 aday ve m tur 2 aday g (m, k) için olası sonuçların toplamı , aşağıdaki formülü alırız.
Eğer k = 1 düzeltilirse , asıl problemi çözmek için yeni yaklaşımımızı oluşturan aşağıdaki özel durumu alırız.
Özyinelemeli bir formül
Şimdi, 1. turdan sonra reklamlar sırasında uykuya daldığınızı ve 3. turun son yarışmasını kimin kazandığını ve dolayısıyla 2 m k $ 'lık büyük ödülü kimin kazandığını görmek için tam zamanında uyandığınızı varsayın . Başka bir bilginiz yok, adayın toplamda ne kadar para ödülü kazandığı bile. Kalan para ödülü kaç şekilde dağıtılabilir?
Eğer kazanan 2. raunttaki adaylardan biriyse, şimdiden 3. rauntta ilerlemiş olmaları gerektiğine şimdiden başladık . Böylece, etkin bir var k + 1 3 yuvarlak ama sadece adayları m - 1 Geçen yarışmasının galibi bildiğimiz için yuvarlak 2'de adayları, sadece orada 1 - m yüzden orada, belirsiz sonuçlarla yarışmalar (m g - 1, k + 1) olası sonuçlar.
Kazanan 2. raundu atlayan k adaylardan biriyse , hesaplama biraz zorlaşır. Daha önce olduğu gibi, sadece m - 1 mermi kaldı, ama şimdi hala 3. raundda K adayımız ve 2. raundda m adayımız var. 2. raunt adayların sayısı ve 3. raunt yarışmasının sayısı farklı olduğu için olası sonuçlar g basit bir çağırma ile hesaplanabilir . Ancak, ilk raunt 2 aday cevapladıktan sonra - doğru ya da yanlış - raund 2 adaylarının sayısı bir kez daha m - 1 raunt 3 yarışmalarıyla eşleşir . Aday ilerlerse, k + 1 tur 3 aday vardır ve bu nedenle g (m - 1, k + 1)Olası sonuçlar; Aday elimine edilir ise, yuvarlak 3 adayların sayısının kalır k ve orada gr (m - 1, k) olası sonuçları. Adayın ilerleme göstermesi veya ilerlememesi nedeniyle, bu iki durumu birleştiren g (m - 1, k + 1) + g (m - 1, k) olası sonuçlar vardır.
Şimdi, büyük ödülü kazanabilecek tüm k + m adayları için potansiyel sonuçları eklersek, sonuç g (m, k) ile eşleşmelidir . Her biri g (m - 1, k + 1) potansiyel sonuçlara yol açan m round 2 yarışmacı, g (m - 1, k + 1) + g (m - 1, k) yol açan k round 3 yarışmacı var olanlar. Özetle, şu kimliği alıyoruz.
Temel kasa ile birlikte
bu iki formül g fonksiyonunu tamamen karakterize eder .
Bir golfy uygulaması
Süre
g=lambda m,k=1:0**m or(m+k)*g(m-1,k+1)+k*g(m-1,k)
(49 bayt 0**m
verir 1 kez m damla 0 ) ya da
g=lambda m,k=1:m<1 or(m+k)*g(m-1,k+1)+k*g(m-1,k)
(48 bayt, 1 yerine True döndürür ) geçerli çözümler olurdu, kaydedilecek baytlar var.
Bir fonksiyonu tanımlarsak f numarası alır n yerine numarası tur 1 aday m , yani ilk bağımsız değişken olarak yuvarlak 2 aday,
özyinelemeli formülü alırız
temel durum ile
Sonunda biz var
bu yüzden Python uygulaması
f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)
( 1 kez k/n
verim 1 = n ) eldeki görevi 1 tabanlı dizinlemeyle çözer.