您的位置:首页 > 其它

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处理,

代码如下:

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).
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: