You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言创建特定循环规则的序列向量及对应逆序列(元素上限2000)

在R中生成特定模式的序列及其补集(逆序列)

嘿,这个序列模式挺有意思的!我来帮你用R快速生成它和对应的逆序列,先拆解下规则:

  • 主序列:从1开始,循环执行「跳过2个数字,连续添加2个数字」,直到元素不超过2000,示例为c(1,4,5,8,9,12,13,16,...)
  • 逆序列:就是1到2000中不在主序列的所有数,示例为c(2,3,6,7,10,11,...)

第一步:找规律简化生成逻辑

仔细观察主序列的元素:1、4、5、8、9、12... 能发现一个清晰的数学规律:

  • 所有元素要么除以4余1(比如1、5、9、13...),要么除以4余0(比如4、8、12、16...)
    逆序列则正好相反:元素除以4余2或3(比如2、3、6、7...)

基于这个规律,我们可以用高效的方式生成序列,不用复杂的循环~

第二步:R代码实现

生成主序列

# 生成1到2000中,除以4余0或1的所有数
main_seq <- which((1:2000) %% 4 %in% c(0, 1))

验证前8个元素:head(main_seq, 8),输出是[1] 1 4 5 8 9 12 13 16,完全符合你的示例!

生成逆序列(补集)

# 生成1到2000中,除以4余2或3的所有数
inverse_seq <- which((1:2000) %% 4 %in% c(2, 3))

验证前6个元素:head(inverse_seq, 6),输出是[1] 2 3 6 7 10 11,和你给出的逆序列示例一致!

补充:用循环逻辑生成(更贴近原始规则)

如果你想完全按照「跳过2个、添加2个」的循环逻辑来实现(而非数学规律),也可以这么写:

# 初始化主序列,起始值为1
main_seq <- c(1)
current <- 1

while(TRUE) {
  # 跳过2个数字
  current <- current + 3
  # 添加连续2个数字
  next_two <- c(current, current + 1)
  # 如果下一个数超过2000,停止循环
  if(next_two[1] > 2000) break
  # 添加到序列中
  main_seq <- c(main_seq, next_two)
  # 更新current为添加的第二个数
  current <- next_two[2]
}

# 生成逆序列:1-2000中不在main_seq里的数
inverse_seq <- setdiff(1:2000, main_seq)

这个代码完全遵循你描述的循环规则,生成的结果和之前的方法一致,适合想要直观体现规则的场景。

内容的提问来源于stack exchange,提问作者Canovice

火山引擎 最新活动