erl_线性结构-Josephu(约瑟夫问题 )问题

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).
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值