Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 求解Josephus置换_R_For Loop - Fatal编程技术网

R 求解Josephus置换

R 求解Josephus置换,r,for-loop,R,For Loop,假设100个人以1到100的顺序站成一个圆圈。1号有一把剑。他杀死了下一个人(即2号),并将剑交给下一个人(即3号)。所有人都这么做,直到只有一个人活下来。最后还有多少人幸存 从1到100有100人 我试过了 persons <- c(1:100) for (i in 1:100) { qu <- persons[seq_along(persons) %% 2 > 0] if (q2 == 2) { print(q2[2]) } } 但是这个答案是65,这

假设100个人以1到100的顺序站成一个圆圈。1号有一把剑。他杀死了下一个人(即2号),并将剑交给下一个人(即3号)。所有人都这么做,直到只有一个人活下来。最后还有多少人幸存

从1到100有100人

我试过了

persons <- c(1:100)
for (i in 1:100) {
  qu <- persons[seq_along(persons) %% 2 > 0]
  if (q2 == 2) {
    print(q2[2])
  }
}
但是这个答案是65,这是错误的,不能解决问题


任何解决方案如何做到这一点?

在这个解决方案中,假设持剑者是向量中的第一人。那个人杀死了下一个人并移动到队伍的尽头

如果有一个人,那么这个人就是幸存者

kill <- function(people = seq_len(100)) {
  if (length(people) == 1) return(people)

  kill(
    c(tail(people, -2), people[1]))
}


kill()
#> [1] 73

这让一个人还活着,但我不确定问题是什么

persons=rep("ALIVE",100)
for(i in 1:100) {
  if(i+1<101){
    if(persons[i+1]=="ALIVE"){
      persons[i]<-"DEAD"
    }
  }
  print(persons)
}
persons=rep(“活着”,100)
因为(我在1:100){

如果(i+1这里有@Paul优雅的答案,用非递归的方式重写,那么它可能更容易理解

people <- 1:100
while (length(people) > 1) {
  people <- c(people[-(1:2)], people[1])
}
print(people)
# [1] 73
people 1){

人这并不是说我不喜欢递归,但这里有一个更通用的解决方案,它适用于任何人口规模:

kill <- function(n = 100) {
  seq1 <- 2 ^ seq_len(31)
  seq2 <- n / seq1
  seq2 <- c(n, floor(seq2[seq2 >= 3]))
  sum(seq1[1:length(seq2)][seq2 %% 2 == 1], 1)
}

kill yes这是正确的答案。如果您可以在
if语句中详细说明您的代码,if语句只是检查是否只剩下一个人。如果有,则我们返回该人。否则,将删除前两个人,并将旧的第一个人添加到末尾。然后应用相同的函数给这群新来的人。只是为了说明一下,这个问题叫做。
people <- 1:100
while (length(people) > 1) {
  people <- c(people[-(1:2)], people[1])
}
print(people)
# [1] 73
kill <- function(n = 100) {
  seq1 <- 2 ^ seq_len(31)
  seq2 <- n / seq1
  seq2 <- c(n, floor(seq2[seq2 >= 3]))
  sum(seq1[1:length(seq2)][seq2 %% 2 == 1], 1)
}