关于约瑟夫环的递归思路

 

有n个人,编号为1~n,从第一个人开始报数,从1开始报,报到m的人会死掉,然后从第m+1个人开始,重复以上过程。在死了n-1个人后,问最后一个人的编号是?

 

解法一模拟:

采取一个dead[]数组,每次从一个没有死的人开始,活着的人依次报数(那么需要跳过dead[i]==true的人),到m处那个人去世

同时计数num++  当杀死num==n-1时,返回dead[]数组中为false的人下标+1

易错点(下标)

 

解法二递归:

 

 

将n个人排开,第m个人奖去世=》子问题为:剩余后面开始(过头继续链接上前面部分)n-1个人的约瑟夫环问题

假设N-1个人最终活下来的人为k,也就是n-1个人中的第k个,那么这个人在原先N个人的位置是:(k+m-1)%n +1

 

    int ysf(int n, int m) {
        // write code here
        
      if(n==1)
          return 1;
       else
          return (ysf(n-1,m)+m-1)%n+1;
        
        
    }

 

 

这类递归比较难构想,类似于递归入门问题:汉诺塔问题。将待解决的问题推挪给下一次解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值