【问题标题】:Recursive for loop in RR中的递归for循环
【发布时间】:2017-12-06 15:41:44
【问题描述】:

我正在努力编写这个递归程序,想知道是否有人可以提供帮助。

我想编写这个递归方程:

for k=1,2,...

beta(k)=k-sum_(i=0)^(k-1)Kchoosei*beta(i)*exp(-i(k-i))

我已经在 R 中手动完成了它,但想把它放在一个函数中。

beta0<-0

beta1<-1-choose(1,0)*beta0*exp(-0*lambdaL*(1-0))
beta2<-2-choose(2,0)*beta0*exp(-0*lambdaL*(2-0))-choose(2,1)*beta1*exp(-1*lambdaL*(2-1))
beta3<-3-choose(3,0)*beta0*exp(-0*lambdaL*(3-0))-choose(3,1)*beta1*exp(-1*lambdaL*(3-1))-choose(3,2)*beta2*exp(-2*lambdaL*(3-2))
beta4<-4-choose(4,0)*beta0*exp(-0*lambdaL*(4-0))-choose(4,1)*beta1*exp(-1*lambdaL*(4-1))-choose(4,2)*beta2*exp(-2*lambdaL*(4-2))-choose(4,3)*beta3*exp(-3*lambdaL*(4-3))

【问题讨论】:

  • lambdaL 未定义且不在您的一般方程式中

标签: r loops for-loop recursion


【解决方案1】:

您可以为总和定义第二个循环。请注意,此处的索引以 1 而不是 0 开头,这会导致“索引移位”。

beta = numeric()
beta[1] <- 0

for (k in 1:10){
  beta[k+1] <- k
  for (i in 0:(k-1))
    beta[k+1] <- beta[k+1] - choose(k, i)*beta[i+1]*exp(-i*(k-i))
}

beta
# [1] 0.000000 1.000000 1.264241 2.080705 3.247551 4.528104 5.748673
# [8] 6.876234 7.941197 8.972749 9.987645

【讨论】:

    【解决方案2】:

    我认为您需要 2 个函数,因为您需要每个以前的 beta 值作为输入,而您只需要一个输出。这是我的建议(根据您的lambaL进行调整,因为您的帖子有一些歧义,它适用于LambdaL == 1):

    beta_vec <- function(k){
      if(k == 0) 0 else {
        beta_vec_old <- beta_vec(k-1)
        c(beta_vec_old,sum(sapply(0:(k-1),function(i){1-choose(k,i)*beta_vec_old[i+1]*exp(-i*(k-i))})))
    }}
    
    beta <- function(k){
      tail(beta_vec(k),1)  
    }
    
    # > beta_vec(5)
    # [1] 0.000000 1.000000 1.264241 2.080705 3.247551 4.528104
    # > beta(5)
    # [1] 4.528104
    

    (因代码中的错字而编辑)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多