如何生成交替递增的序列

时间:2016-11-18 06:05:22

标签: r

我想创建一个从2开始到65结束的序列,它首先递增3,然后递增1,然后递增3,然后递增1,依此类推,给出如下所示的最终结果:< / p>

sequence(2,5,6,9,10,13,14,17,18,21,22,25,26,29,30,33,34,37,38,41,42,45,46,49,50,53,54,57,58,61,62,65)

有谁知道如何生成这样的序列?

5 个答案:

答案 0 :(得分:6)

在R中使用回收,首先创建3&amp; 65之间的所有数字,然后只选择备用对!然后将2附加到它。

要选择备用对,我选择以下模式:c(FALSE,FALSE,TRUE,TRUE),这样前2个被拒绝,接下来2个被接受。 对于例如c(3,4,5,6)[c(FALSE,FALSE,TRUE,TRUE)]表示3,4被拒绝,5,6被接受

c(2,c(3:65)[c(F,F,T,T)])
[1]  2  5  6  9 10 13 14 17 18 21 22 25 26 29 30 33 34 37 38 41 42 45 46 49 50 53 54 57 58 61 62
[32] 65

由于我正在研究Rcpp,我认为应该对此进行探索。谢谢你提出这个问题。完成了我在Rcpp的第一次任务:)

library(Rcpp)

cppFunction('NumericVector func(int start, int end){
        int j = 0;
        int len = ceil((end-start)/2);
        if (end%2 != 0){
          len+=1;
        }
        Rcpp::NumericVector result(len);

        result[j++] = start;

        int i = start;
        while(j <= len){
            if (j%2 == 0){
                result[j++] = i+1;
                i+=1;
            }
            else {
                result[j++] = i+3;
                i+=3;
            }
        }              
        return result;
  }')

> func(2,65)
 [1]  2  5  6  9 10 13 14 17 18 21 22 25 26 29 30 33 34 37 38 41 42 45 46 49 50 53 54 57 58 61 62 65
> func(2,20)
[1]  2  5  6  9 10 13 14 17 18
> func(1,10)
[1] 1 4 5 8

答案 1 :(得分:4)

易于推广

begin = 2
end = 65
d = c(3, 1)
l = length(d)
cumsum(c(begin, rep(d, len = (end-l)/l)))

[1]  2  5  6  9 10 13 14 17 18 21 22 25 26 29 30 33 34 37 38 41 42 45 46 49 50 53 54 57 58 61 62 65

答案 2 :(得分:3)

可能没有推广,但

> sort(c(seq(2,65,4), seq(5,65,4)))
[1]  2  5  6  9 10 13 14 17 18 21 22 25 26 29 30 33 34 37 38 41 42 45 46 49 50 53 54 57 58 61 62 65

答案 3 :(得分:1)

我正在以您正在使用的编程语言为您提供逻辑实现。

#include <iostream>
using namespace std;

int main() {
    int start = 2, end = 65;
    std::cout << start;
    cout<<"\n";
    for(int i=start;i<=end;i++){
       if(i == start){
          cout<<i+3;
          cout<<"\n";
          i +=3;
       }else{
          cout<<i;
          cout<<"\n";
       }
    }
    return 0;
}
  

在C ++中实现;

答案 4 :(得分:1)

尝试这个来获得序列的前n个项,我们有

enter image description here

n <- 32   # get first 32 terms
x <- 1:n
2+as.integer(x/2)*3+as.integer((x-1)/2)

# [1]  2  5  6  9 10 13 14 17 18 21 22 25 26 29 30 33 34 37 38 41 42 45 46 
#     49 50 53 54 57 58 61 62 65