R 求解Josephus置换
假设100个人以1到100的顺序站成一个圆圈。1号有一把剑。他杀死了下一个人(即2号),并将剑交给下一个人(即3号)。所有人都这么做,直到只有一个人活下来。最后还有多少人幸存 从1到100有100人 我试过了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,这
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)
}