由约瑟夫问题到一类特殊的递归式
由约瑟夫问题到一类特殊的递归式
参考资料:《具体数学》
前言:
其实。。本文和约瑟夫问题没什么关系。。题目是吸引你点进来的。
正文:
约瑟夫问题
这个,大家应该都知道吧,不知道的可以看一看这个
下面是约瑟夫问题的一个简化版本:
有n个人围成一个环,依次编号为1到n,然后1,2报数,报到2的人出列,求最后出列的人的编号。
首先,我们打表找规律一下,规定J(n)表示n个人的约瑟夫问题中最后出列的人的编号。
n | J(n) |
---|---|
1 | 1 |
2 | 1 |
3 | 3 |
4 | 1 |
5 | 3 |
6 | 5 |
7 | 7 |
8 | 1 |
9 | 3 |
\(\cdots\) | \(\cdots\) |
好像,全是奇数?
其实,在第一轮时,转一圈后所有的偶数都出列了,剩下的当然只有奇数。
那么我们考虑一下转一圈后的情况:
当n为偶数时,转一圈删掉了n后又回到了1号,这时,原来编号为i的人的位置现在的人的编号变成了2*i-1,所以我们可以得到:
当n为奇数时,转一圈删掉了n-1后又删掉了1号,来到了3号,这时,原来编号为i的人的位置现在的人的编号变成了2*i+1,所以我们可以得到:
综合以上内容,我们可以得到下面的式子:
有了这个式子,我们就可以快速计算J(n)了。但是我们还是不满足,递归式算起来还是太麻烦,有没有更好的方法呢?
我们在观察上面的表,有没有发现什么呢?
1,1,3,1,3,5,7,1,3...
1,1,3,1,3,5,7,1,3,5,7,9,11,13,15,1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,1!
好像。。按2的幂次分组,然后每一个都是前一个加二!
可以归纳一下:
首先,1很明显符合该性质。
现在假设前i-1符合这个性质,那么
如果i为偶数,则:
如果i为奇数,则:
证毕。
还有什么性质吗?
不妨从二进制的眼光来看一看这个问题:
\(n=(1b_{m-1}\cdots b_1b_0)_2\)
\(2^m=(10\cdots 00)_2\)
\(l=(0b_{m-1}\cdots b_1b_0)_2\)
\(J(n)=2l+1=(b_{m-1}\cdots b_1b_01)_2\)
J(n)是n循环左移了一位!
约瑟夫问题讲完了,还有吗?
当然还有了,你没看见题目吗?
一类特殊的递归式
虽然我们成功的解决了约瑟夫问题的一种简单形式,并能够在\(O(1)\)(m确定)或\(O(loglogn)\)(m不确定)的时间复杂度内解决,但是我们还远远没有满足。不妨再来看看这个递归式:
太特殊了,我们来看看这个:
容易看出,前面的就是\(\alpha =1,\beta =-1 ,\gamma =1\)的特殊情况。怎么办?
当然还是打表了。
n | f(n) |
---|---|
1 | \(\alpha\) |
2 | \(2\alpha +\ \beta\) |
3 | \(2\alpha \ \ \ \ \ \ \ \ + \gamma\) |
4 | \(4\alpha + 3\beta\) |
5 | \(4\alpha+2\beta+\gamma\) |
6 | \(4\alpha+\ \beta+2\gamma\) |
7 | \(4\alpha\ \ \ \ \ \ \ \ +3\gamma\) |
8 | \(8\alpha+7\beta\) |
9 | \(8\alpha+6\beta+\gamma\) |
\(\cdots\) | \(\cdots\) |
有了上面的经验,这次就简单一点了。
首先按二的幂次分组,然后大力猜结论。
我们设\(f(n)=A(n)\alpha+B(n)\beta+C(n)\gamma\),剩下的就是求出来\(A(n),B(n),C(n)\)。
当然,我们还是可以归纳,但是在这里,我们可以用一些更简单的方法:
我们令\(\alpha =1,\beta=0,\gamma=0\),那么原递归式就变成了
易知,\(f(n)=2^m ,n=2^m+l,l\in[0,2^m)\)
又\(f(n)=A(n)\)
所以\(A(n)=2^m\)
然后我们令\(f(n)=1\)得
解得\(\alpha=1,\beta=-1,\gamma=-1\)
所以\(f(n)=A(n)-B(n)-C(n)=1\)
令\(f(n)=n\)得
解得\(\alpha=1,\beta=0,\gamma=1\)
于是得到方程:\(A(n)+C(n)=n\)
所以:
解得:
小总结:解递归式时可以带入几个比较特殊的数或者是函数,来帮助我们计算,可以减少我们找规律然后再归纳的时间。
这样就行了?
当然不行。
上面我们找到了关于2进制的性质,那么现在有没有呢?
当然有了,为什么没有呢。
我们设\(\beta_0=\beta,\beta_1=\gamma\),带到原递归式里看一看吧。。
如果2进制位里面不止可以填01的话,那就相当于:
这样还不够,这并不是我们的一类递归式。真正的递归式在下面:
这个跟上面的是差不多的。直接扔结论:
现在差不多了。我才不会告诉你我就会这些。
例题:有递归式:
求f(17)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步