猴子选大王的问题是一个比较经典的问题,很多人都已经写了很多了,今天我结合R语言的特点,R语言是一种动态语言,动态处理数据较为方法。
至于问题的重述,就在这里简单的简述一下。n个猴子坐成一圈,从1:n编号,报道k的猴子出局,下一次从下一个猴子开始计数(如果是最后一个,下一个猴子将转到第一个),这里给出猴子一次出局的顺序
算法
- 用1:n模拟猴子的编号
- 第一个的下标k%%n
- 对他们的编号进行更新(出局后的编号后面的放到前面,1:出局之前的编号放到后面)
- 重复2,3步骤,直到剩余1个编号
f <- function(n,k)
{
da <- 1:n
re <- NULL
while(length(da) > 1)
{
n_da <- length(da)
t <- k%%n_da
if(t!=0)
{
re <- c(re,da[t])
}
else
{
re <- c(re,da[n_da])
}
#取出第一个
if(t == 1)
{
da1 <- NULL
}
else if(t == 0)
{
da1 <- da[1:(n_da-1)]
}
else
{
da1 <- da[1:(t-1)]
}
if(t == 0)
{
da2 <- NULL
}
else
{
da2 <- da[(t+1):n_da]
}
da <- c(da2,da1)
}
re <- c(re,da)
re
}
f(6,3)
f(8,5)
f(10,4)