2012-02-25 2 views
4

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

  1. рассчитайте у (1) ---> 3
  2. высчитывает у (3) ---> 7
  3. высчитывает у (7) ...
  4. ...
  5. оканчиваются на п-й случай

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

+0

возможно '? Reduce'? –

ответ

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) 
Смежные вопросы