2

vector v = c(250,1200,700)、開始値n、および関数があるとします。

f = function(v){

g = function(v){ 
    cases(
    v <= 20 -> 0.1,
    v > 20 & v <= 100 -> 0.075,
    v > 100 -> .05
    )  
  }
  suppressWarnings(g(v))
}

fcasesパッケージから使用して書かれていmemiscます-私はまだRに慣れていないfので、「より良い」方法でコーディングできるかどうかを知りたいと思っています. とにかく、次の再帰プロセスを実行するコードを探しています (「長い」長さのベクトルを含む):

f(n), 
f(n)*v[1]+n, 
f(f(n)*v[1]+n)*v[2] + f(n)*v[1]+n, 
f(f(f(n)*v[1]+n)*v[2] + f(n)*v[1]+n)*v[3] + f(f(n)*v[1]+n)*v[2] + f(n)*v[1]+n 

最終的には、最後の行の値に興味があります。

どんな助けにも乾杯

4

2 に答える 2

3

私があなたを正しく理解していれば、これはあなたが話しているプロセスです:

 X1 = f(n)
 X2 = X1*v[1] + n
 X3 = F(X2)*v[2] + X2
 X4 = F(X3)*v[3] + X3 
...

すべての中間ステップが必要な場合、結果に中間ステップも格納する必要があるため、再帰関数は役に立ちません。したがって、基本的な R を使用して簡単にコーディングできます。

Thefun <- function(v,n){
  l <- length(v)
  res <- numeric(l+1)

  res[1] <- g(n)
  res[2] <- res[1]*v[1] + n
  for(i in seq(2,l)){
    res[i+1] <- res[i] + g(res[i])*v[i]
  }
  return(res)
}

結果の最後の値は、必要な結果です。最後のステップの結果だけが必要だったので、次を使用して再帰的に実行できますRecall

Recfunc <- function(v,n){
    l <- length(v)
    if(l > 0){
        res <- Recall(v[-l],n)
        return(g(res)*v[l] + res)
    } else {
      return(n)
    } 
}

余談ですが

次のように、関数 g を異なるように定義できます (私はそれを fv と呼びます):

fv <- function(v){
   0.1*(v <= 20) + 0.075*(v > 20 & v <=100) + 0.05*(v>100)
}

関数と比較すると、速度が 6 倍向上します。

vec <- sample(1:150,1e5,TRUE)
benchmark(
   fv(vec),
   g(vec),
   columns=c("test","replications","elapsed","relative"),
   replications = 1000

)

     test replications elapsed relative
1 fv(vec)         1000    9.39    1.000
2  g(vec)         1000   56.30    5.996
于 2013-02-07T15:27:15.637 に答える
1

ここで、それnが v の長さであると仮定します。再帰を次のように書き直します。

y1 <- n                  ## slight change here
y2 <- f(y1)*v[1] +y1, 
y3 <- f(y2)*v[2] +y2
y4 <- f(y3)*v[3] +y3
.... I can''t see the terms > length(v) so my first assumption

たとえば、次のように実装できます。

filter.f <- function(func=f,coef=v){
  n <-  length(coef)
  y <- numeric(n)
  y[1] <- n
  for(i in 2:n)
    y[i] <- func(y[i-1])*coef[i-1]+y[i-1] ## here the recursion
  y[1] <- f(n)
  y
}

 filter.f()
[1]   0.1 124.0 159.0 191.5
 v=c(250, 1200, 700)
filter.f()
[1]   0.1  28.0 118.0
于 2013-02-07T14:59:44.457 に答える