将“数字”的赔率数字相加

DrJ*_*rJS 9 r

我正在尝试对特定数字(但不包括其自身)的赔率进行求和,例如:N = 5 那么 1+3 = 4

a<-5
sum<-function(x){
  k<-0
  for (n in x) {
    if(n %% 2 == 1)
      k<-k+1      
  }
         return(k)
}

sum(a)

# [1] 1
Run Code Online (Sandbox Code Playgroud)

但该函数不起作用,因为它计算赔率数字而不是对它们求和。

akr*_*run 7

我们可以使用矢量化方法

a1 <- head(seq_len(a), -1)
sum(a1[a1%%2 == 1])
[1] 4
Run Code Online (Sandbox Code Playgroud)

如果我们想要一个循环,也许

f1 <- function(x) {
  s <- 0
  k <- 1
  while(k < x) {
    if(k %% 2 == 1) {
      s <- s + k
    }
     k <- k + 1
     
     }
s

}
f1(5)
Run Code Online (Sandbox Code Playgroud)

OP代码中的问题是

for(n in x)
Run Code Online (Sandbox Code Playgroud)

其中x是单个值,因此n将被循环一次 - 即如果我们的输入是 5,那么它将仅循环一次,并且 'n' 将是 5。相反,它将是seq_len(x -1)。正确的循环是这样的

f2<-function(x){
  k<- 0
  for (n in seq_len(x-1)) {
    if(n %% 2 == 1) {
     k <- k + n 
    }
    
  }
    k    
}


f2(5)
Run Code Online (Sandbox Code Playgroud)

注意:sum是一个base R函数。因此,最好用不同的名称来命名自定义函数


Tho*_*ing 5

从数学上讲,我们可以尝试以下代码来计算总和(N可以是奇数或偶数)

(ceiling((N - 1) / 2))^2
Run Code Online (Sandbox Code Playgroud)