约瑟夫

编辑: 时间:2023-03-19 17:44:54

约瑟夫

约瑟夫—— 数学与历史共同构筑的益智游戏经典 一、 约瑟夫问题 约瑟夫问题是一道经典的排队游戏问题,起源与古代历史中对于数学问题的探索与思考密切相关。

问题描述如下:有n个人坐成一个圆环形,从第一个人开始顺时针数到第m个人,将此人移除,从下一个人开始重复此过程,直到只剩下一个人。

问最终剩下的那个人的编号是多少? 二、 策略与解法 对于此问题,可以推断出一个显然的结论:最后能留下来的人的编号是“(n-1)%(m+1)”。

如何证明这个结论呢?可以上网搜索到很多版本的证明过程,其中较为常见的是递推式的推导与直接数学公式的推导两种方法。

1. 递推式法 递推式法是通过自下而上的方式,依次计算各个状态下的剩余人数,最终得出最后幸存者的编号。

设n个人坐成的圆环形队列的结果为f(n,m),则有以下递推式可得: f(1,m)=0 f(n,m)=[f(n-1,m)+m]%n (n>1) 其中,当只有1个人时,该人即为最后幸存者,编号为0当有n个人时,数到第m个人后,将该人移除后,剩余n-1个人又形成了一个圆环。

根据递归的思想,我们可以将问题拆解为n-1个人的情况,并在其中找到与n个人的情况之间的关系。

最后,针对这个递推式,我们可以直接进行计算,得到最终答案。

2. 直接公式法 直接公式法是通过推导数学公式的方式,解决此问题。

首先令f(n,m)表示删除过程中最后幸存者的编号。

由于每次删除一个人之后,下一个人的序号会相应向前移动m个位置,进而影响到圆环队列内后续人员的编号,我们可以将其转化为相对于当前最后那个人的序号进行计算:f(n,m)是在f(n?1,m)长度为n?1个人的序列上,从第m位置开始计数后剩下的人的编号。

我们再令k=f(n?1,m),表示了长度为n?1的固定起点编号序列中,最终幸存者的编号,则有以下两种情况: k%m的值为r(k能够被m整除):此时,删除第m个人会导致下一次要在该点计数,于是新的起点位置从2开始, 长度从n-1变为n-2。

剩余的k-1个人的序号为(m+1),(m+2),...,(n-1),0, 1,……,(r-1),(r+1),...,(n-2). k%m的值不为r此时,删除第m个人后k-1个人中的每个人作为新的序列的第一位。

甚至可以推导出,相邻两次删除之间的编号相差了m。

于是,对于长度为n的序列,其胜利者可以表示为: f(n,m)=(f(n?1, m)+m)%n 其中省略了第二个等于号右边的一大堆式子。

三、举例与应用 约瑟夫问题有很多变种,比如往圆环中插入新元素、更改数数的方向等。

此外,它也被广泛地用于算法设计与复杂度优化的模型中,如双向链表实现、递归与非递归算法实现等等。

总之,约瑟夫问题是数学与历史共同构筑的益智游戏经典,以其独特的思维特点与数学技巧,激发了无数读者的数学热情与好奇心。

语音朗读: