Функция, которая возвращает себя в R? - PullRequest
4 голосов
/ 26 февраля 2012

В лямбда-исчислении Y -комбинатор возвращает себя так: Y a = a Y a , в частности здесь .Предположим, что есть какая-то тривиальная функция, такая как y (x) = 2 * x + 1 (предположим, что для упрощения используются числа Чёрча)какая-то функция прорыва.Я хочу сделать что-то вроде этого

  1. вычислить y (1) ---> 3
  2. вычислить y (3) ---> 7
  3. вычислить y(7) ...
  4. ...
  5. завершить в n-м случае

Как я могу сделать это в R, используя функциональный образ мышления?Есть что-то встроенное?

Ответы [ 3 ]

5 голосов
/ 26 февраля 2012

Я не совсем понимаю обозначения лямбда-исчисления, поэтому не могу точно знать, что такое Y-комбинатор, но мне интересно, есть ли функция R Recall() (страница помощи здесь) не поможет вам построить то, что вы после. Вот пример его использования для вычисления факториала:

# 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 голос
/ 26 февраля 2012

Если вам просто нужна функция 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)
1 голос
/ 26 февраля 2012

Попробуйте это:

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

N = 10; seed = 3; i = 1
for(i in 1:N){
     seed = Y = myfun(seed)
     print(Y)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...