在Lambda演算中,Y -combinator像这样返回自己Y a = a Y a,特别是here。假设一些简单的函数,如y(x)= 2 * x + 1(为简单起见,假设教会的数字),我想这样做y y我想要某种突破功能。我想要做这样的事情在R中返回自己的函数?
- 计算Y(1)---> 3
- 计算Y(3)---> 7
- 计算Y(7)...
- ...
- 终止于第n个的情况下
我如何用思维的功能性的方式做到这一点R中?有内置的东西吗?
在Lambda演算中,Y -combinator像这样返回自己Y a = a Y a,特别是here。假设一些简单的函数,如y(x)= 2 * x + 1(为简单起见,假设教会的数字),我想这样做y y我想要某种突破功能。我想要做这样的事情在R中返回自己的函数?
我如何用思维的功能性的方式做到这一点R中?有内置的东西吗?
我真的不明白的演算的符号,所以不能确切地知道Y型组合子是什么,但我不知道如果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
试试这个:
myfun = function(x) { 2*x+1 }
N = 10; seed = 3; i = 1
for(i in 1:N){
seed = Y = myfun(seed)
print(Y)
}
如果你只是想要一个功能,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)
也许'减少'? – 2012-02-26 00:41:41