【发布时间】:2013-03-20 21:12:11
【问题描述】:
您好,我正在尝试将以下递归伪代码定义转换为 R 中的函数式编程构造:
a = [ random numbers between 0 and 10 ]
b = [ random numbers between -5 and 5 ]
c = [ random numbers between 0 and -10 ]
x0 = 200
index = 0
function f(x) {
index = index + 1
if( x is between 200 and 220 ) return f(x + a[index])
else if(x is between 220 and 250) return f(x + b[index])
else if(x is 250 and above) return f(x + c[index])
}
可执行的R代码是:
a <- sample(1:10,size=50, replace=TRUE)
b <- sample(-5:5,size=50, replace=TRUE)
c <- sample(-1:-10,size=50, replace=TRUE)
index <- 0;
myfunc <- function(x){
index <<- index + 1;
if(index == 50) return(x)
if(x <= 220){ return(myfunc(x + a[index])) }
else if(x > 220 & x < 250){ return(myfunc(x + b[index])) }
else {return( myfunc(x + c[index]))}
}
print(myfunc(200));
想讨论任何方法,包括 Map/Filter/Reduce 或 Vectorisation。非常感谢。
此外,我怎样才能保留 50 个 x 元素的整个路径(而不是只看 x 的一个答案)。
【问题讨论】:
-
iiuc,你说的这些功能在这里都没用……
-
说实话,你的代码看起来有点奇怪,不清楚你想要实现什么。你能用统计术语解释你想模拟什么随机变量(或向量)吗? “50 x 元素的整个路径”是什么意思?
-
大家好,感谢您的关注。它是一个从 200 开始的路径相关值。然后它在 200 到 300 之间移动 50 次,具体取决于 x 的前一个值(因此是递归定义)。通过 50 个 x 元素的整个路径意味着我想通过函数 myfunc 知道 x 的所有中间值。例如,如果我使用 for 循环重写它,我将声明一个结果向量为 50,然后在到达最终值 x 之前迭代地填充它。你要我写一个for循环的版本吗?
-
你的函数是如何递归的?为什么不想写一个 for 循环呢?
-
嗨 @hadley 是的 - 大多数递归都可以表示为 for 循环,我可以在这里轻松地创建一个 for 循环。但我试图在函数式编程结构中表达这一点。关于在应用场景中理解 R 函数式编程的力量的文档/指南非常少。