1.递归问题之约瑟夫问题

↘锁芯ラ 提交于 2020-02-26 02:32:06

约瑟夫问题

问题描述

从围成标记有记号1到n的圆圈的n个人开始,每隔一个人删去一个人,知道只剩一个人。例如n=10的起始图形:
在这里插入图片描述
消去的顺序是2,4,6,8,10,3,7,1,9,于是5幸存了下来。问题:确定幸存的号码J(n)J(n)

解决思路

  1. 从简单情形出发,找规律
nn 1 2 3 4 5 6
J(n)J(n) 1 1 3 1 3 5

发现并没有明显规律。

  1. 发现J(2n)J(2n)J(n)J(n)的关系:
    在这里插入图片描述
    J(20)时,删去2,4,6…2n后,剩下的情形和J(n)相似,个数与顺序相同就表明幸运号码在相同的地方,不同之处就是,每项的数字大小,容易得到:
    J(2n)=2J(n)1J(2n)=2J(n)-1
    类似的发现 J(2n+1)=2J(n)+1J(2n+1)=2J(n)+1
    由以上递推式可以列表:
nn 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 …
J(n)J(n) 1 1 3 1 3 5 7 1 3 5 7 9 11 13 15 1 …

可以得出
J(2k+m)=2m+1,           k,m=0,1,2...J(2^k+m)=2m+1,\,\,\,\,\,\,\,\,\,\,\, k,m=0,1,2...

扩展思考

  1. 在求解过程中,2的幂起着重要作用,所以自然要来研究n和J(n)的以2为基数的表示。假设n的二进制形式为:
    n=(bmbm1...b1b0)2=2m+(bm1...b1b0)2n=(b_mb_{m-1}...b_1b_0)_2=2^m+(b_{m-1}...b_1b_0)_2 其中 bm=1b_m=1
    则有
    J(n)=2(bm1...b1b0)2+1=(bm1...b1b00)2+1=(bm1...b1b0bm)2J(n)=2*(b_{m-1}...b_1b_0)_2+1\\ =(b_{m-1}...b_1b_00)_2+1\\ =(b_{m-1}...b_1b_0b_m)_2
    即,可以看到J(n)J(n)的值是2进制表示时nn循环向左移动一位的值。
  2. 我们再来考虑J(J(n))J(J(n)),自然想到的是nn的2进制值向左循环2位即可。但实际上如果nn(101)2(101)_2时,移动一位有J((101)2)=(011)2J((101)_2)=(011)_2,正确。此时若不删除0继续左移一位,则J(J((101)2))=3<(110)2=6J(J((101)_2))=3<(110)_2=6。根据问题的定义我们知道J(n)nJ(n)\leq n,当首位为0,不删除继续循环左移的话得到的数值肯定会变大,即J(n)>nJ(n)>n,所以此类情况错误。
  3. 接下来我们考虑J(J(...J(n)...)mJ()\overbrace{J(J(...J(n)...)}^{m个J()}的情况,这意味着我们要将2进制的n循环左移m位,其中每当0在首位时就删去0,当mm足够大时最终结果将会得到稳定的值(全部由1组成),期间数值逐渐减小。
    概括一下,就是最终结果会是n的2进制值中所有1的构成的值(1...1)2(1...1)_2
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!