【阅读具体数学笔记】递归分类下的约瑟夫问题将递归式转化为封闭式

本文主要是介绍【阅读具体数学笔记】递归分类下的约瑟夫问题将递归式转化为封闭式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本书中的约瑟夫问题定义如下:从围成标有记号1到n的圆圈的n个人开始,每隔一个删去一个人,知道只有一个人幸存下来。

下图是n=10的起始图形:
这里写图片描述
削去的顺序为2,4,6,8,10,3,7,1,9,于是最后有5幸存下来。问题是对总人数为n时,幸存者的号码J(n)是多少?
首先面对这个问题的时候,由于题目数据比较少,我们会来时一步一步的推导,第一次循环的时候,从2开始削去了环中的所有偶数,所以我们知道了最后题目的结果肯定是一个奇数。随着一轮一轮的循环删除在环中的数据规模不断缩小,所以我们把它抽象成如下形式:
我们假设一开始有2n个人,经过第一轮消除所有偶数之后编程如下形式:
这里写图片描述
下一个离开的就是3号(因为上一个删除了2n),对比开始没有进行删除的情况我们可以知道,按顺序删除的每个数据变成了之前的数据加倍再减去一,就是说

J(2n)=2J(n)-1,n>=1.

下面再来考虑对于奇数的情形,对于2n+1个人,标号为1的人恰好在标号为2n的人之后被删除,我们类比2n的情形可以得到
这里写图片描述
J(2n+1)=2J(n)+1,n>=1.

将以上的方程和J(1)=1组合起来就可以得到在所有情形下定义J的递归式:
J(1)=1.
J(2n)=2J(n)-1,n>=1.
J(2n+1)=2J(n)+1,n>=1.

为了能够在有限次运算内求得指定的J(n),我们来将递归式求得封闭形式:
对一个递归式,发现规律的最好方法就是将数据打表
这里写图片描述
我们发现表中的数据以2的幂将表分组(1,2,4,8…),并且每一组中的数据都是在递增2。所以我们可以讲n表示成n=2^m+l,m是使2^m不超过n的最大幂次,l表示在每一个分组中所占的位置,此时的递归式的解可以表示为

J(2^m +l)=2*l+1,m>=0,0<=l<2^m.

下面给出上式的证明,我们对m使用归纳法:当m=0时必定有l=0,所以上式的基础就是J(1)=1,此结论为真。归纳证明分为l是偶数还是奇数,如果m>0并且2^m+l=2n,那么l是偶数,那么根据归纳假设有:

J(2^m+l)=2J(2^(m-1)+l/2)-1=2l+1.

这就是我们想要的结果。当2^m=2n+1为奇数,我们同样有类似的证明成立。
我将在下一篇文章中给出文中递推式的推广,这些探讨将会解释所有这类问题背后的隐藏结构。

这篇关于【阅读具体数学笔记】递归分类下的约瑟夫问题将递归式转化为封闭式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/226854

相关文章

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH