erl_线性结构-Josephu(约瑟夫问题 )问题
2015-09-10 19:43
330 查看
Josephu(约瑟夫问题 )问题:
设编号分别为:1,2,…,n的n个人围坐一圈。约定序号为k(1 <= k < = n)的人从1开始计数,数到m的那个人出列,他的下一位又从1开始计数,数到m的那个人又出列,依次类推,直到所有人出列为止。
设n=8,k=3,m=4时,
出列为:6,2,7,4,3,5,1,8
算法思路:用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后从第k结点起从1计数,计到m时,对应结点从链表中删除;然后再从被删除结点的下一个结点起又从1开始计数….,直到所有结点都列出时算法结束。
Josephu问题,在其他语言都是选用单循环链表循环,在erlang里面实现环的话,个人看法只能循环到尾接着头这样的lists处理,
代码如下:
设编号分别为:1,2,…,n的n个人围坐一圈。约定序号为k(1 <= k < = n)的人从1开始计数,数到m的那个人出列,他的下一位又从1开始计数,数到m的那个人又出列,依次类推,直到所有人出列为止。
设n=8,k=3,m=4时,
出列为:6,2,7,4,3,5,1,8
算法思路:用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后从第k结点起从1计数,计到m时,对应结点从链表中删除;然后再从被删除结点的下一个结点起又从1开始计数….,直到所有结点都列出时算法结束。
Josephu问题,在其他语言都是选用单循环链表循环,在erlang里面实现环的话,个人看法只能循环到尾接着头这样的lists处理,
代码如下:
josephu(N,K,M) when K > 1 andalso K<N andalso M > 1 andalso M<N -> NList = lists:seq(1,N), {H,T} = lists:split(K-1,NList), NList1 = T ++ H, josephu1(NList1,M); josephu(_, _,_) -> false. josephu1([], _M) -> final; josephu1(NList ,M) when length(NList) >= M-> {H,[_Del|T]} = lists:split(M-1,NList), io:format("josephu delete : ~p ~n",[_Del]), josephu1(T++H ,M) ; josephu1(NList, M) when length(NList) < M -> {_,DVuale}= lists:foldl(fun(K,{TL,_DelV})-> case length(TL) >= K of true-> {TL,lists:nth(K,TL)}; _-> {TL++TL,lists:nth(K,TL++TL)} end end,{NList,0},lists:seq(1,M)), io:format("josephu delete : ~p ~n",[DVuale]), josephu1(lists:delete(DVuale,NList), M).
相关文章推荐
- orcl 定时器
- ListView的listitem为EditText无法输入内容问题
- hdu 5312 Sequence(数学推导+线性探查(两数相加版))
- jquery操作select
- java斐波那契数列
- 1.2.1.2.1.12.34.3.1.34.1.2
- block回调具体例子
- 安装MPlayer for linux(FC7)详细介绍--适合菜鸟
- jQuery常用的元素查找方法总
- 游戏常用英文单词缩写
- 【bzoj1179】【apio2009】Atm【强连通分量缩点+spfa】
- BZOJ 2120 色彩数 暴力
- 浅谈数据结构-平衡二叉树
- GitHub--Windows下command line创建与提交
- 如何搭建一个Linux驱动编写环境(centos)
- Spark on Yarn+Hbase环境搭建指南(四)NTP服务设置
- Maven多工程依赖在Eclipse中发布到Server被依赖工程没有生成jar的问题
- 《剑指offer》矩形覆盖
- Android 学习第8课,android的布局方式
- Android 学习第9课,java android 项目的安装与启动过程