r - 将递归函数嵌套在另一个函数中
问题描述
我对递归函数的涉猎不多,但成功编码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)
参数的输出。以此类推,直到用尽为止。直觉上,递归似乎再次成为答案,但我无法找到解决方案。pp
f(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 我知道有一些可用的软件包可以做我想做的事情(隐马尔可夫模型 - 前向算法)。我只是想了解幕后发生的事情并更好地处理递归编程。我感谢社区的任何帮助。谢谢!!
解决方案
您不需要矩阵,您可以继续替换pp
值
g <- function(pp, obs) {
for ( i in 2:8) {
pp <- f(obs[i], pp)
}
log(sum(pp))
}
g(pp, y)
# [1] -6.439479
推荐阅读
- android - 当 kotlin 协程启动并且应用程序突然移动到后台并变得空闲时会发生什么?
- mysql - 为什么使用空白密码的 MySQL root 不能在 shell 脚本中工作?
- r - R中的转置和合并列
- python - 导入db时不存在SQLAlchemy关系
- vba - Vba 抓取 img alt src
- react-native - 无法让 React-Native-WebRTC 工作
- php - Laravel 分页在 AWS EC2 服务器上部署后无法正常工作
- c++ - 循环向量退出并出现错误进程以退出代码 -1073741819 完成
- json - 为什么jsonschema与json不匹配?
- authorization - 如何在 keycloak 管理控制台中对客户端进行 IP 限制