0

我有两个向量。一个是一系列开始或一系列 id,另一个是从每个开始到下一个位置的指南。

我分析的关键位置是第一位置。我将下一个向量中的相应数字添加到知道下一步要移动的位置。

starts <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
nexts <- c(4,2,1,1,3,5,1,1,3,2,10,2,3,4,1,1,1,1,4,6)

我期望从“开始” 1 开始,next 告诉我移动 4 个位置,所以我在开始 1+4 结束,然后从开始 5 next 告诉我移动 3 个位置,现在我在开始 8,位置 8 对应的 next 是 1,我移动到 9,从 9 下一步移动是 3...

最终目标将是一个像这样一个目标 <- c(5,8,9,12....) 的向量。如果我们可以通过在每次“着陆”处读取下一步移动的大小来使用 nexts 进行“跳跃”,那么第一个向量“starts”可能真的不需要。像这样:从 1 我们跳到 4,到达 5,从位置 5 我们跳到 3 到 8 从 8 我们从 1 跳到 9....

4

1 回答 1

3

尽管您没有明确提出问题,但我想您想要的是:

starts <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
nexts  <- c(4,2,1,1,3,5,1,1,3,2,10,2,3,4,1,1,1,1,4,6)

i <- 1
while (i %in% starts) {
    s <- starts[i]
    n <- nexts[s] ### <--- correction: not nexts[i]
    i <- s + n
    cat(sprintf("%d + %d -> %d\n", s, n, i))
}

# 1 + 4 -> 5
# 5 + 3 -> 8
# 8 + 1 -> 9
# 9 + 3 -> 12
# 12 + 2 -> 14
# 14 + 4 -> 18
# 18 + 1 -> 19
# 19 + 4 -> 23

更新:

抱歉,有一种方法可以不使用循环;只需使用递归函数(如果您可以通过循环获得相同的结果,我不建议这样做)...

recursive.func <- function(start, starts, nexts) {
    next.start <- start + nexts[start]
    if (!next.start %in% starts)
        return(next.start)
    return(c(next.start, recursive.func(next.start, starts, nexts)))
}

# execute like this:
my.start <- starts[1]
recursive.func(my.start, starts, nexts)
于 2013-03-19T16:28:30.483 回答