2012-02-25 63 views
4

在Lambda演算中,Y -combinator像这样返回自己Y a = a Y a,特别是here。假设一些简单的函数,如y(x)= 2 * x + 1(为简单起见,假设教会的数字),我想这样做y y我想要某种突破功能。我想要做这样的事情在R中返回自己的函数?

  1. 计算Y(1)---> 3
  2. 计算Y(3)---> 7
  3. 计算Y(7)...
  4. ...
  5. 终止于第n个的情况下

我如何用思维的功能性的方式做到这一点R中?有内置的东西吗?

+0

也许'减少'? – 2012-02-26 00:41:41

回答

5

我真的不明白的演算的符号,所以不能确切地知道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 
1

试试这个:

myfun = function(x) { 2*x+1 } 

N = 10; seed = 3; i = 1 
for(i in 1:N){ 
    seed = Y = myfun(seed) 
    print(Y) 
} 
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)