约瑟夫环:
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)