2016-11-18 18 views
5

我想創建一個從2開始到65結束的序列,它先增加3,然後增加1,然後增加3,然後增加1,依此類推,給出看起來像這樣的最終結果:如何生成一個交替遞增的序列

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) 

有沒有人知道如何去產生這樣一個序列?

回答

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 
+0

不錯的做法! –

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 
+0

好答案 - 但對代碼的解釋有助於人們理解他們在做什麼。一個新手可能不知道'c'的意思,或者'seq'中的所有參數意味着什麼。 – Addison

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++;

+0

做這個邏輯工作?只有當我== 2你遞增3其餘的時間,它會增加只有1右?我弄錯了嗎? –

+0

是的,它會工作,因爲我不是硬編碼值2,而是我正在使用開始比較。是的,它會適用於任何開始結束價值。 @ joel.wilson – PassionInfinite

+0

問題是關於R語言而不是C++ – Uwe

6

在R中使用回收利用,首先創建3 & 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 
+0

#joel.wilson先生謝謝你的解決方案非常感謝,請求你可以請你解釋c(F,F,T,T)。 –

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 
+1

R中的數學運算是矢量化的,所以不需要'sapply'。好得多的x <-1:n; 2 + as.integer(x/2)* 3 + as.integer((x-1)/ 2)'。 – nicola

+0

肯定會讓它更快 –

相關問題