# R语言——约瑟夫环

举报
诡途 发表于 2021/11/19 02:16:03 2021/11/19
【摘要】 约瑟夫环: n个人围成一个圈,从第一个人点名,每数到第三个人,这个人移出圈外, 依次类推,求最后留下来的人编号是? 思路:每次循环重新编码序号作为names,并根据names 进行筛选 拓展:约瑟夫环...

约瑟夫环:

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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

文章来源: blog.csdn.net,作者:诡途,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_35866846/article/details/98948784

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。