在Lambda演算中,Y-combinator返回自己像 Y a = a Y a ,特别是here。假设一些琐碎的函数,例如 y(x)= 2 * x + 1 (为了简单起见,假设教会数字),我想做 Y y 到哪个我想要某种突破功能。我想做这样的事情
如何使用功能性思维方式在R中执行此操作?内置有什么东西吗?
答案 0 :(得分:5)
我真的不明白lambda演算的符号,所以不能确定Y-combinator是什么,但是我想知道R函数Recall()
(help page here)是不是帮助你建立你想要的东西。以下是计算阶乘的一个示例:
# Calculate 4!
(function(n) {if (n<=1) 1 else n*Recall(n-1)})(4)
这里它适用于你描述的例子:
(function(x, n) {if (n<=1) x else Recall(2*x+1, n-1)})(x=1, n=1)
# [1] 1
(function(x, n) {if (n<=1) x else Recall(2*x+1, n-1)})(x=1, n=2)
# [1] 3
(function(x, n) {if (n<=1) x else Recall(2*x+1, n-1)})(x=1, n=3)
# [1] 7
答案 1 :(得分:1)
试试这个:
myfun = function(x) { 2*x+1 }
N = 10; seed = 3; i = 1
for(i in 1:N){
seed = Y = myfun(seed)
print(Y)
}
答案 2 :(得分:1)
如果您只想要一个函数g
,它会转换函数f
进入function(x) f(f(f(f(...f(x)))))
(n次,事先不知道n),
以下应该做。
compose_with_itself_n_times <- function(f,n) {
function(x) {
for(i in seq_len(n)) {
x <- f(x)
}
x
}
}
f <- function(x) 2*x+1
g <- compose_with_itself_n_times(f,10)
g(1)