约瑟夫环(Josephus Problem)是一个经典的数学问题,涉及一个编号为 1 到 n 的人围成一圈,从第一个人开始报数,报到某个数字 m 的人出列,然后再从下一个人开始报数,如此循环,直到所有人都出列。本篇博客将详细解析约瑟夫环问题,并使用Python实现算法。 问题分析 在约瑟夫环问题中,有两个变量需要确定:人数 n 和...
然而Josephus和他的朋友并不想这就死去,于是Josephus让他的朋友和他佯装遵从,他偷偷将朋友和自己安排在第16个和31个位置,最终逃过了这场死亡游戏。 python实现 我们只需要关注三个参数: 1.人的总数:total_nums 2.出局数值:step 3.需要出局的人数:out_nums 所以我们可以直接写出一个约瑟夫环问题的通用解法 def Jo...
python3约瑟夫环问题 问题描述:n个人围成一个圈,从第一个人开始数1,数到第k个出局,然后下一个人继续从1数,求出局人编号 思路:将所有人编号放到数组里,一个人出局后,下一个人加上k对数组长度求余,得出下一个要删除的编号。 defJoseph(n,k): a= [xforxinrange(1, n+1)] num=kforiinrange(n):pr...
1.约瑟夫问题如果使用链表来求解比较麻烦,这里采用循环队列的处理。 约瑟夫问题可以等价为l连续地DeQueue()两次,然后再将第一次DeQueue()的值EnQueue()入队列尾,直到队列中只剩下一个元素。 # 循环队列代码如下: #include <stdio.h>#include<stdlib.h>#defineMAX 100/*Maximum size of Queue */typedefstruct_Que...
接下来是具体的实现步骤。以Python语言为例,我们可以用Lambda表达式配合内置函数reduce实现约瑟夫环问题的一行代码解法。具体代码为: josephus = lambda n, m: reduce(lambda x, y: (x + m) % y, range(1, n + 1)) 在这行代码中,reduce函数连续地对序列range(1, n + 1)中的元素应用递归公式,最终得到...
Python 语言的代码如下: classSolution(object):deffindTheWinner(self,n,k):pos=0foriinrange(2,n+1):pos=(pos+k)%ireturnpos+1 C++ 语言的代码如下: classSolution{public:intfindTheWinner(intn,intk){intpos=0;for(inti=2;i<n+1;++i){pos=(pos+k)%i;}returnpos+1;}}; ...
解法一程序分析: 循环的开始和结束:循环的结束取决于圈内是否还有“人”,可以用一个变量alive表示初始人数,每一次出圈,alive – 1。判断alive是否非0即可。 while(alive > 0) 每一次循环,就是“过”一个人,但是,这个人有两种不同的状态:在圈内和不在圈内;在圈内就报数,number+1,不在圈内就不参与报数,nu...
n)=(f(n - 1) + m - k) % n + 1 于是,可以得到递归程序(Python)如下:...