gpt4 book ai didi

r - 将简单的递归关系转换为函数式程序

转载 作者:行者123 更新时间:2023-12-01 13:57:12 27 4
gpt4 key购买 nike

您好,我正在尝试将以下递归伪代码定义转换为 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 的一个答案)。

最佳答案

您可以使用带有累积选项的 Reduce 函数来保存所有中间值。

要了解这是如何工作的,请在简单的“求和”函数上尝试一下

x = rep(200, 50)
Reduce(x=x, f=sum)
Reduce(x=x, f=sum, accumulate=T)

您正在寻找的答案需要您重写您的特殊函数,以便将其传递给 Reduce:

foo <- function(x, y = 0){
if (200 <= x & x < 220){
x + sample(1:10, 1)
}
else if(220 <= x & x < 250){
x + sample(-5:5, 1)
}
else if (250 <= x){
x + sample(-1:-10, 1)
}
}

Reduce(x=rep(200, 50), f=foo, accumulate=T)

关于r - 将简单的递归关系转换为函数式程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15506060/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com