f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)
在线尝试!
不同的方法
自从发布此挑战以来,我一直试图为该问题提出一个递归解决方案。尽管我只使用笔和纸失败了,但我还是设法将公式转化为高尔夫的实际问题(至少对于某些实用定义而言),这使分析变得更加容易。
想象一个有k + m个候选作品的游戏节目,其工作原理如下。
在第1轮中,所有候选人都必须尽快完成特定任务。该ķ是完成任务最快的候选人赢得的1K $(一个kilodollar)每提前3轮。
在第二轮中,剩下的m个候选人有第二次加入其他k的机会。每个候选人都会被问一个问题。如果他们正确回答了问题,他们将赢得1 k $并进入第3轮。但是,如果他们未能回答问题,他们将被淘汰出局。这意味着第三轮将有k到k + m个候选者,具体取决于有多少人可以回答他们的问题。
第三回合包含m个与第一回合相似的竞赛。在每个竞赛中,参与者必须完成特定任务。与第一轮不同的是,只有一名候选人获得奖金,但是所有候选人都可以参加下一场比赛。每场比赛的报酬是之前的两倍。第一个支付2 k $,最后一个支付2 m k $。
请注意,由于所有奖品都是2的幂,因此知道候选人获得了多少奖金就意味着我们知道他们是否晋级到第三轮以及赢得了哪些第三轮比赛。
假设您正在观看比赛节目,并且第一轮已经结束,那么您知道哪些k名候选人已经进入第三轮,哪些m名候选人仍停留在第二轮。剩余的奖金可以通过几种方式分配?
一旦我们知道第二轮的m个候选中的哪个已经晋升到第三轮,就可以很容易地计算出此特定情况的可能结果。如果有j名候选人晋级,则第三轮共有k + j名候选人,因此每场比赛k + j可能的结果。与米在第3轮个人比赛,这使得第(k + j)的米的结果为所有米比赛。
现在,j可以取0到m之间的任何值,具体取决于第2轮中哪些候选者正确回答。对于j的每个固定值,有j个候选者的m C j个不同组合可能已经推进到第3轮。k个第3个候选者和m个第2个候选者g(m,k)的可能结果总数,我们得到以下公式。
如果固定k = 1,则得到以下特殊情况,这构成了解决原始问题的新方法。
递归公式
现在,假设你1轮后的广告的时候睡着了,时间刚刚好,看看谁赢得了第3轮的比赛最后,因此巨奖醒来2 中号 ķ$ 。您没有其他信息,甚至连候选人总共赢了多少奖金都没有。剩余的奖金可以通过几种方式分配?
如果获奖者是一个中号的第2轮的候选人,我们已经现在,他们必须提前到轮3。因此,我们在第3轮中实际上有k + 1个候选人,但在第2轮中只有m-1个候选人。由于我们知道最后一场比赛的获胜者,因此只有m-1项比赛的结果不确定,因此有g(m -1,k + 1)可能的结果。
如果获胜者是跳过第2轮的k个候选人之一,则计算会变得有些棘手。和以前一样,仅剩m-1轮,但是现在我们在第3轮中仍然有k个候选人,在第2 轮中有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字节,一旦m下降到0,则0**m
产生1)甚至
g=lambda m,k=1:m<1 or(m+k)*g(m-1,k+1)+k*g(m-1,k)
(48个字节,返回True而不是1)将是有效的解决方案,仍有字节需要保存。
如果我们定义一个函数f,该函数将第1轮候选的数目n代替第2轮候选的数目m作为第一个参数,即
我们得到了递归公式
基本款
最后,我们有
所以Python实现
f=lambda n,k=1:k/n or n*f(n,k+1)+k*f(n-1,k)
(一旦n = kk/n
产生1)通过基于1的索引解决了手头的任务。