递归函数:保存每个调用到列表的输出

时间:2014-02-04 21:43:49

标签: r list recursion functional-programming

我想将以下递归函数的每个函数调用的输出保存到列表中。此外,我需要知道哪个(j,l)对对应于结果列表的哪个条目。

我创建了一个精简版本来重现问题。如果我应该提供更多信息来帮助解决问题,请告诉我。任何帮助都非常感谢。谢谢。

#the recursive function
phi <- function(phik,j,l,k,d) {
  if(j==0) {
    diag(d)
  }
  else{
    if(j==1) {
      if(l>k) {
        0 * diag(d)
      }
      else{
        phik[[l]]      
      }      
    }
    else {
      if(l>k) {
        0 + phi(phik,j-1,l,k,d) %*% phik[[1]]
      }
      else {
        phi(phik,j-1,l+1,k,d) + phi(phik,j-1,l,k,d) %*% phik[[1]]
      }      
    }
  }
}

#related stuff
set.seed(123456)
phik <- vector(mode="list", length=3)
phik[[1]] <- matrix(rnorm(n=16,mean=0,s=1),nrow=4)
phik[[2]] <- matrix(rnorm(n=16,mean=0,s=1),nrow=4)
phik[[3]] <- matrix(rnorm(n=16,mean=0,s=1),nrow=4)
d <- nrow(phik[[1]])
k <- length(phik)

#function call
phiout <- phi(phik,j=10,l=1,k=k,d=d)

1 个答案:

答案 0 :(得分:1)

因此,使用递归函数有点棘手,因为如果你想要中间步骤的结果,你可以将它们粘合在一个列表中。当然,这意味着当您在函数中使用递归的结果时,您必须挖掘出您想要的值。这听起来有些令人费解,但在你的情况下,我只是说你必须在每一步都返回一个phijl的小清单,但只需退出{ {1}}进行乘法运算时。这是一个小例子:

phi

您可能会对我在第一到第三种情况下嵌套结果的原因感兴趣(当#the recursive function phi <- function(phik,j,l,k,d) { if(j==0) list(list(phi=diag(d),j=j,l=l)) else{ if(j==1) { if(l>k) list(list(phi=0 * diag(d),j=j,l=l)) else list(list(phi=phik[[l]],j=j,l=l)) } else { if(l>k) { first<-phi(phik,j-1,l,k,d) second<-list(list(phi=0 + first[[1]]$phi %*% phik[[1]], j=j,l=l)) c(second,first) } else { first<-phi(phik,j-1,l+1,k,d) second<-phi(phik,j-1,l,k,d) third<-list(list(phi=first[[1]]$phi+(second[[1]]$phi %*% phik[[1]]), j=j, l=l)) c(third,first,second) } } } } 为0或1时)。如果你看一下其他案例,可能会很清楚。当j(和l>k不是0或1)时,会有两个调用j。在这种情况下,会返回phi,其中包含两组listphii,因此它必须是j { {1}}秒。当我想从返回的值中提取list时,很难判断它是list还是phi list,所以我只是将它们标准化为同样的东西。

我认为list陈述是丑陋的,但其他人不同意。如果您愿意,可以添加它们,但它们是完全没必要的(在这种情况下)。

一些示例输出:

list