# R语言——约瑟夫环

约瑟夫环:

n个人围成一个圈,从第一个人点名,每数到第三个人,这个人移出圈外,
依次类推,求最后留下来的人编号是?

思路:每次循环重新编码序号作为names,并根据names 进行筛选
拓展:约瑟夫环的关键点——每次循环数&最后留下的人数;代码中的整除数即为每次循环数,循环条件即为最后留下的人数


Survive_No <- function(n){
  all <- 1:n 							#根据人数创建一个向量
  names(all) <- 1:n				#给all向量创建names属性
  while(length(all)>1){ 			#当剩余1个人时候停止循环
    end_names <- as.numeric(names(all[length(all)]))			#获取all向量最后一个人的names并转换成numerical格式
    all <- all[ifelse(as.numeric(names(all))%%3==0,F,T)]		#删除names为3的整数倍的元素,即留下的人编号
    names(all) <- 1:length(all)+end_names%%3				
    #生成新的names,从上一次末尾的names【整除3的余数加1】开始,到新all的长度
  }
  unname(all)	#输出去除names的变量
}
Survive_No(100000)
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诡途

你的鼓励是我 创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值