在R中返回自身的函数?

时间:2012-02-25 22:32:44

标签: r functional-programming

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

  1. 计算y(1)---> 3
  2. 计算y(3)---> 7
  3. 计算y(7)......
  4. ...
  5. 终止于第n个案例
  6. 如何使用功能性思维方式在R中执行此操作?内置有什么东西吗?

3 个答案:

答案 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)