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




