R 根据应用于最后生成的数字的方程式生成序列递增的向量

R 根据应用于最后生成的数字的方程式生成序列递增的向量,r,R,我想生成一个向量,从1开始,到900为止,每次增加都是基于最后生成的数字加1,然后乘以1.55;然后将其四舍五入到最接近的数字 也就是说,顺序应该是: First number: 1 (i.e., start at 1) Second number: 3 (i.e., (1+1)*1.55) Third number: 6 (i.e., (3+1)*1.55) 我试过: x0=1 seq(x0, 600, (+1*1.55)) 使用while循环的不太聪明的方法 使用while循

我想生成一个向量,从1开始,到900为止,每次增加都是基于最后生成的数字加1,然后乘以1.55;然后将其四舍五入到最接近的数字

也就是说,顺序应该是:

First number:  1 (i.e., start at 1)

Second number: 3 (i.e., (1+1)*1.55)

Third number:  6 (i.e., (3+1)*1.55)
我试过:

 x0=1
 seq(x0, 600, (+1*1.55))

使用while循环的不太聪明的方法


使用while循环的不太聪明的方法

还原溶液 下面是一个使用Reduce的解决方案

R文件

标杆管理 以下是基准数据:

Unit: microseconds
             expr    min     lq      mean median     uq      max neval cld
   ronak(1, 10^5) 34.644 38.656 56.628269 40.844 52.878 25973.41 1e+05   c
    nate(1, 10^5) 36.103 40.844 57.294825 43.032 53.243 26714.79 1e+05   c
  darren(1, 10^5) 29.903 33.550 46.599951 35.374 41.209 12248.98 1e+05  b 
 nateCpp(1, 10^5)  2.553  4.012  6.578349  4.741  5.471 10963.14 1e+05 a 
不奇怪,C++的解决方案是最快的。对于仅限R的解决方案

@DarrenTsai的递归是最快的递归,但应谨慎使用,可能会出现嵌套表达式过多等问题-在这种情况下,随着数字的快速增长,然后是 @RonakShah和我的职能。 功能

还原溶液 下面是一个使用Reduce的解决方案

R文件

标杆管理 以下是基准数据:

Unit: microseconds
             expr    min     lq      mean median     uq      max neval cld
   ronak(1, 10^5) 34.644 38.656 56.628269 40.844 52.878 25973.41 1e+05   c
    nate(1, 10^5) 36.103 40.844 57.294825 43.032 53.243 26714.79 1e+05   c
  darren(1, 10^5) 29.903 33.550 46.599951 35.374 41.209 12248.98 1e+05  b 
 nateCpp(1, 10^5)  2.553  4.012  6.578349  4.741  5.471 10963.14 1e+05 a 
不奇怪,C++的解决方案是最快的。对于仅限R的解决方案

@DarrenTsai的递归是最快的递归,但应谨慎使用,可能会出现嵌套表达式过多等问题-在这种情况下,随着数字的快速增长,然后是 @RonakShah和我的职能。 功能

递归解决方案:

FUN <- function(start, end){
  n <- length(start) ; last <- start[n]
  if(last >= end)
    return(start[-n])
  else
    FUN(c(start, round((last + 1) * 1.55)), end)
}

FUN(1, 900)
# [1]   1   3   6  11  19  31  50  79 124 194 302 470 730
递归解决方案:

FUN <- function(start, end){
  n <- length(start) ; last <- start[n]
  if(last >= end)
    return(start[-n])
  else
    FUN(c(start, round((last + 1) * 1.55)), end)
}

FUN(1, 900)
# [1]   1   3   6  11  19  31  50  79 124 194 302 470 730

所以第三个数字是6.2,你做了6,当它变得像之后。5,你需要地板或天花板?所以第三个数字是6.2,你做了6,当它变得像之后。5,你需要地板或天花板?
ronak <- function(x0,stop) {
  new_num = 1
  num = 1

  while(new_num < stop) {
    new_num = round((new_num + 1) * 1.55)
    num = c(num, new_num)
  }

  head(num,-1)
}
nate <- function(x0, bound) {
  r        <- 1.55
  estimate <- round(log(bound, r)) 
  vec      <- Reduce(f = function(y,x) round((1+y)*r), x = 1:estimate, init = x0, accumulate = TRUE)
  vec      <- vec[vec <= bound]
  vec
}
darren <- function(start, end){
  n <- length(start) ; last <- start[n]
  if(last >= end)
    return(start[-n])
  else
    darren(c(start, round((last + 1) * 1.55)), end)
}
FUN <- function(start, end){
  n <- length(start) ; last <- start[n]
  if(last >= end)
    return(start[-n])
  else
    FUN(c(start, round((last + 1) * 1.55)), end)
}

FUN(1, 900)
# [1]   1   3   6  11  19  31  50  79 124 194 302 470 730