NOIP2013提高问题求解T2(关于递推与递归)
同步发表于我的洛谷博客。
NOIP2013提高问题求解2:
现有一只青蛙,初始时在n号荷叶上。当它某一时刻在k号荷叶上时,下一时刻将等概率地随机跳到1,2,……,k号荷叶之一上,直到跳到第1号荷叶为止。当n=2时,平均一共跳2次,n=3时,平均一共跳2.5次。当n等于5时,平均一共跳几次。
先将问题转为青蛙随机跳了一步以后的情况,分为5种情况,分别是落在1号、2号、3号、4号、5号荷叶上。每种情况发生的概率为1/5。
然后设f(n)为n片荷叶所需的平均次数。显然,f(1)=1。
先从简单的考虑:
当n=2:
共2种情况:落在1号或2号上。
落在1号上,问题变为求f(1)。
落在2号上,问题变为求f(2)+1。
Q:为什么要加1?
A:因为它已经跳过一次了。
Q:为什么f(1)不用?
A:因为它已经到了。
由于是求平均值,且f(1)已知,那么可列方程:
f(2)=(f(1)+1+f(2))*1/2
解得f(2)=2。
Q:为什么要把所有的相加?
A:请考虑加法原理。
然后到n=3的状态:
共3种情况:落在1号或2号或3号上。
落在1号上,问题变为求f(1)。
落在2号上,问题变为求f(2)+1。
落在3号上,问题变为求f(3)+1。
熟不熟悉?
每一个原问题都可以分成n个子问题,子问题规模变小(???),子问题相加即可求得原问题的答案。
有点递归的感觉。
来看看扩展到n=k的状态:
共k种情况:落在1号或2号或3号或……或k号上。
落在1号上,问题变为求f(1)。
落在2号上,问题变为求f(2)+1。
落在3号上,问题变为求f(3)+1。
……
此处省略
……
落在k号上,问题变为求f(k)+1。
可得方程f(k)=(f(1)+1+f(2)+1+f(3)+······+1+f(k))*1/k
接下来,对上面这个方程进行合并同类项:
k*f(k)=(f(1)+1+f(2)+1+f(3)+······+1+f(k))
k*f(k)=k-1+(f(1)+f(2)+f(3)+······+f(k))
(k-1)*f(k)=k-1+(f(1)+f(2)+f(3)+······+f(k-1))
f(k)=1+(f(1)+f(2)+f(3)+······+f(k-1))*1/k
至此,f(n)的递推公式就被我们推出了:
f(n)=1+(f(1)+..f(n-1))/(n-1)
这道题的难点也就在于递推公式的推出,推出递推公式,n=5神马的,都是渣渣。
好了,now,来个总结:首先我们先用递归的思想,来尝试着把问题缩小规模,规模缩小后,就可以列出关系式了。再从一般到特殊,列出一般情况下的关系式后,化简,我们发现化简后的式子的形式形如递推式,那么,我们就可以自下往上来求解了。
实际上,有时候递推和递归从本质上来说,并无差别。有些时候我们用递归的思想来考虑问题,用递推的方式来实现求解,这样可以大大减小思维难度及代码实现难度。
至于为什么递推和递归从本质上来说,并无差别。首先得搞清楚,这是对于一个能用递推求解的问题而言的。
因为任何循环都可以用递归写(只要你胆够大,不怕爆0),而一般我们实现递推无非就是循环+数组之类的了。所以,递推一定可以用递归来实现。For example,斐波那契数列。(想想动态规划吧,dfs无非就是把复杂度增加了而已)但请注意,不是所有的递归都可以用循环实现滴,比如说,回溯法。那么,可得出:递归不一定可以用递推来实现。
希望对你能有帮助,哪怕一点点,我也满足了。
可转载,请注明作者及其来源。