首页 > 解决方案 > 将递归函数嵌套在另一个函数中

问题描述

我对递归函数的涉猎不多,但成功编码f()了它可以输出概率向量(在本例中为 N = 3)。

# Data
ps <- structure(c(0.68, 0.255, 0, 0.17, 0.595, 0, 0.15, 0.15, 1), .Dim = c(3L, 3L))
po <- structure(c(0.7, 0, 0, 0.3, 1, 1), .Dim = 3:2)
pp <- c(1,0,0)
y <- c(1,1,2,1,2,2,1,2)
# Recursive function
f <- function(o,pp,q = 1,si = 1:(nrow(ps)){
  if(q == length(si)) return(0)
  else{
    return(ps[q,si]*po[si,o]*pp[q] + f(o = o,pp = pp,q+1,si = si))
  }
}

> f(y[2],pp)
[1] 0.476 0.000 0.000
> f(y[3],pp)
[1] 0.204 0.170 0.150

现在,我需要作为inf(o = y[2],pp = pp)参数的输出。以此类推,直到用尽为止。直觉上,递归似乎再次成为答案,但我无法找到解决方案。ppf(o = y[3],pp = .)o

我可以通过几种方式得出正确答案。下面是一个for循环。这个答案似乎很浪费,因为我每次调用函数时都会初始化一个矩阵以及存储不需要的值。我想另一种解决方案是pp循环覆盖。另一种方法是将它们嵌套f()或管道在一起,但这似乎是多余的并且不是很灵活。有没有更优雅的解决方案?

期望的输出:

g <- function(pp,obs){
  b <- matrix(0,3,8)
  b[,1] <- pp
  for(i in 2:8){
    b[,i] <- f(o = obs[i],pp = b[,i-1])
  }
  log(sum(b[,8]))
}

> g(pp = pp,obs = y)
[1] -6.439479

PS 我知道有一些可用的软件包可以做我想做的事情(隐马尔可夫模型 - 前向算法)。我只是想了解幕后发生的事情并更好地处理递归编程。我感谢社区的任何帮助。谢谢!!

标签: rrecursion

解决方案


您不需要矩阵,您可以继续替换pp

g <- function(pp, obs) {
  for ( i in 2:8) {
    pp <- f(obs[i], pp)
  }
  log(sum(pp))
}
g(pp, y)
# [1] -6.439479

推荐阅读