约瑟夫环-递归算法

约瑟夫环问题 —— 递归法的简单易懂的解释 最近看了大佬的一篇博客:一行代码解决约瑟夫环问题 前面两个方法都看懂了,比较简单,但是最后一个只用一行代码的解法,实在是没有看懂,但是根据大佬的思路,我也做出了自己的解释,虽然在简洁性上不如大佬的一行完毕,但是整个思路不是很难懂,主要是记忆起来比较方便。大家可以先尝试看看大佬解法。 问题描述 编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,... 阅读详情


问题描述:

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。


问题求解:

假设下标从0开始,0,1,2 .. m-1共m个人,从1开始报数,报到k则此人从环出退出,问最后剩下的一个人的编号是多少?


现在假设m=10
0 1 2 3  4 5 6 7 8 9    k=3
第一个人出列后的序列为:
0 1 3 4 5 6 7 8 9
即:
3 4 5 6 7 8 9 0 1(*)
我们把该式转化为:
0 1 2 3 4 5 6 7 8 (**)
则你会发现: ((**)+3)%10则转化为(*)式了
也就是说,我们求出9个人中第9次出环的编号,最后进行上面的转换就能得到10个人第10次出环的编号了 
设f(m,k,i)为m个人的环,报数为k,第i个人出环的编号,则f(10,3,10)是我们要的结果
当i=1时,  f(m,k,i) = (m+k-1)%m
当i!=1时,  f(m,k,i)= ( f(m-1,k,i-1)+k )%m

所以程序如下:

#include<stdio.h>
#include <stdlib.h>
int fun(int m,int k,int i)
{

	if(i==1)
		return (m+k-1)%m;
	else
		return (fun(m-1,k,i-1)+k)%m;

}
int main(int argc, char* argv[])
{

	for(int i=1;i<=10;i++)
		printf("第%2d次出环:%2d\n",i,fun(10,3,i));
	system("pause");
	return 0;
}

Reference:

http://www.cnblogs.com/yangyh/archive/2011/10/30/2229517.html

约瑟夫环递归算法详解与实现 迭代算法通过循环来模拟报数和淘汰的过程,避免了递归调用的额外开销,并在实际应用中通常具有更好的性能表现。约瑟夫环问题是一个著名的理论问题,其背景是在古罗马时期,有n个犯人被围成一个圈,从第一个人开始报数,每次报到m的人将被处决,然后从下一个人开始重新报数,直到所有人都被处决。有n个人围成一圈,从第一个人开始报数,每次报到m的人将被淘汰出局,然后从下一个人开始重新报数,直到最后只剩一个人为止。假设我们知道在n-1个人中,谁是幸运者(即他在子问题中的序号),那么我们可以通过这个信息来找出在n个人中谁是幸运者。 阅读详情

相关推荐

电脑版微信多开,最详细教程没有之一

首先桌面任意的位置右键新建文本文档输入如下代码: TASKKILL /F/IM WECHAT.EXE start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" ...

大超子 4390

约瑟夫环问题——递归解决

问题: 约瑟夫,是一个古犹太人,曾经在一次罗马叛乱中担任将军,后来战败,他和朋友及另外39个人躲在一口井里,但还是被发现了。罗马人表示只要投降就不死,约瑟夫想投降,可是其他人坚决不同意。怎么办呢,他想到一个主意: 让41个人围成一个圆圈,从第一个人开始报数,数到3的那个人被旁边的人杀死。这样就可以避免自杀了,因为犹太人的信仰是禁止自杀的。结果一群人杀来杀去最后只剩下两个了,就是约瑟夫和他朋友,于...

qq_38596491的博客 3179

如何解决Windows系统中缺失oem*.inf文件导致的软件运行问题

本文详细解析了Windows系统中因oem*.inf文件缺失导致软件无法运行的常见问题。文章阐述了oem*.inf文件作为安装信息文件的重要作用,并提供了从精准定位文件路径、安全获取与替换文件的手动修复步骤,到利用专业工具进行一站式修复的完整解决方案。最后,还给出了从软件安装来源、卸载习惯到系统维护等方面的预防措施,帮助用户彻底避免此类问题。

water的专栏 546

约瑟夫环问题——一般解+数学模型递归解

约瑟夫环问题集合形式成环逻辑。约瑟夫问题是个有名的问题:N个人围成一圈,每个人都有自己对应的号数(号数从1到N),从1号开始报数(报数从数字1开始,轮到下一个人数字递增),当有人报数的数字为M将会被杀掉,下一个人接着从数字1开始报数,循环多次直到最后只剩下一个人,其余人都将被杀掉。如图所示,M为步长,先减掉6个人(arrayList.size()-left),在对8求余数,就等于2,表示杀集合中第2个,转换成下标2-1赋值给变量index,remove(index)。

Gojavaee的博客 2066

Arduino创意作品实战案例:手把手教你做温控风扇

通过这个实用的arduino创意作品,轻松实现温度感应与风扇自动控制,结合传感器与编程逻辑,打造智能散热系统,是入门者理想的arduino创意作品实践项目。

weixin_42311427的博客 608

北航机器学习期末考试试题2020年春

北航机器学习期末考试试题2020春 看csdn上试题收费,积分还挺高,本着共享的理念,把2020春季ML考试的试题公开,若侵权,立删 前8道题10分,第9题20分 决策树采用ID3算法 对宇宙星球是否适合生存分类 SVM的原理;软间隔、硬间隔;以及对非线性样本点分类 集成学习的原理,以及及串行boosting以及bagging的简单概括 K-means与混合高斯模型的异同以及EM算法的原理,如何计算 马尔可夫随机场最大团;马尔可夫随机场的联合概率分布(势函数表示),贝叶斯网络联合概率分布 PCA主成分基于

qq_43343919的博客 5414

约瑟夫环(数组和递归)

printf("请输入人数(1-100):");printf("请输入报数:");int i;for(i=1;i

RVETHR的博客 2078

PIPE Interface解析之PIPE SerDes/Original架构

PIPI Interface;SerDes架构;Original架构;PHY Tx结构;PHY Rx结构;

weixin_45176819的博客 2605

约瑟夫环递归方式

/* 第二种方法其实是一种递归的方式,它是将递归的结果进行逆推的 第一步: 约瑟夫环最后一次的执行其实就是两个人之间进行 将此时的二人进行编号为0,1,从0开始报数,我们很容易想到需要的值m: 如果是奇数的话,最后一个报数的是0,胜利者是1 如果是偶数的话,最后一个报数的是1,胜利者是0 公式实现:f(2, m) =(0 + m)% 2这样可以的到获胜者的下标 第二步: 倒数第二次是3个人进行 将此时的三人编号为0,1,2,从0开始报数,我们可以了解到时先淘汰了一人,然后是.

qq_51086925的博客 4669

YOLO26全网首发:CVPR2026 FAA| 解决YOLO Neck跨尺度方向冲突--- FAAFusion频域对齐融合模块 | 暴力涨点篇

本文改进:FAAFusion引入YOLO neck ,代替nn.Upsample和Concat

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 638

【JCR一区级】鱼鹰算法OOA-CNN-LSTM-Attention故障诊断分类预测【含Matlab源码 5711期】

鱼鹰算法OOA-CNN-LSTM-Attention故障诊断分类预测 完整代码和数据,方可运行;数据可直接替换,适合小白!可提供运行操作视频!

订阅付费专栏Matlab(奶茶价版)或下载付费资源,可赠送奶茶价版付费专栏指定代码1份; 3600

递归算法解约瑟夫环

约瑟夫环问题介绍:17世纪的法国数学家加斯帕在《数目的游戏问题》中讲了这样一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。 这里我们简化一下问题,假设共10个人,每数到4就将第四个人...

zzwjames的博客 800

FH8626V100之开发环境搭建

FH8626V100是富瀚微出的一款带摄像头的方案,开发工具在Linux 上进行。版本 Ubuntu 20.04 64位。

xue_nuo的博客 1万+

约瑟夫环:递归算法

原文地址:http://www.cnblogs.com/yangyh/archive/2011/10/30/2229517.html 约瑟夫环:递归算法 假设下标从0开始,0,1,2 .. m-1共m个人,从1开始报数,报到k则此人从环出退出,问最后剩下的一个人的编号是多少? 现在假设m=10 0 1 2 3 4 5 6 7 8 9 k=3 第一个人出列后的序列为: ...

anshiwu4779的博客 123

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

约瑟夫环非递归算法分析

【Joseph问题描述】 n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。 【求解思路】 我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始

lhfx_313的专栏 406

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

[算法]递归一行代码解决约瑟夫环问题

https://mp.weixin.qq.com/s/xBiQHKdSop1HzKTF7EVhCQ 约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 ...

GKoSon的博客 844

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【约瑟夫环的递归算法的理解】

本文通过约瑟夫环问题(n=9,k=3)阐述了递归算法的推导过程。关键在于发现每次出列后剩余人员会重新编号,形成新的环,从而得出递推公式:f(n)=(f(n-1)+k)%n。该公式表示当前轮幸存者位置与上一轮位置的关系。文中通过具体例子验证了这一规律,并提供了对应的Python实现代码,其中递归基例为n=1时返回0(0-based索引),其他情况则通过递推公式计算。最后通过用户输入测试了算法,输出时需将0-based索引转换为1-based编号。

hnbc2020的博客 226

约瑟夫环之递归算法

问题描述: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。由第一个人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到最后剩下一个人。 一般的思路就是通过一个count计数的方法,循环遍历链表,逐一删除。但是这样的方法时间复杂度要有O(n×m),(总共要删除...

weixin_33709609的博客 367

php解决约瑟夫环(递归算法)

“约瑟夫环”是一个数学的应用问题:一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把它踢出去…,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。 方法一:递归算法 public function getBigMonkey(){ $...

weixin_42188216的博客 324

Py递归算法解“约瑟夫环”的一种变形问题

Py递归算法 解“约瑟夫环” (“约瑟夫环”的一种变形问题) 题目: 约瑟夫环的一种变形。我们考虑的问题是开始时有n个人,记为1到n,站成一个圆圈。每一步,每第2个人将被去除,直到只剩下一个人为止。我们把剩下的人记为J(n),用程序求出1≤n≤16的J(n)(“约瑟夫环”点此跳转百科词条) 思路解析:   根据题意,要把人依序站队,数据结构选择数组(list)最为合适,用整数1~n来标识队列中人的初始站队位置。要让队列像贪吃蛇一样首尾相接成为圆圈,依list特性借助了list的pop和app

m0_57158496的博客 1389

约瑟夫环问题C++代码实现:高效递归算法的精妙应用

约瑟夫环问题C++代码实现:高效递归算法的精妙应用 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 解决约瑟夫环问题,找出最后剩下的人的编号。 项目介绍 在计算机科学领域,算法是解决问题的基础,而约瑟夫环问题(Josephus Problem)则是算法训练中常见的一个问题。它不仅考察编程者对递归算法的理解,还能锻炼逻辑思维能力。本项目提供了一个使用C++语言实...

gitblog_06715的博客 656
上一篇: 堆排序
下一篇: 表情识别数据集整理
IT修道者
IT修道者 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄17年 326粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值