W rachunku Lambda, Y -combinator zwraca się w ten sposób Y a = a Y a, a konkretnie tutaj. Załóżmy jakąś trywialną funkcję, taką jak y(x)=2*x+1 (załóżmy liczby Kościoła dla uproszczenia) i chcę to zrobić Y y do której Potrzebuję jakiejś funkcji break-out. Chcę zrobić coś takiego

  1. obliczyć y(1) --->3
  2. oblicz y(3) --->7
  3. obliczyć y(7)...
  4. ...
  5. zakończ w n-tym przypadku

Jak mogę to zrobić w R używając funkcjonalnego sposobu myślenia? Czy jest coś wbudowanego?

4
hhh 26 luty 2012, 02:32

3 odpowiedzi

Najlepsza odpowiedź

Tak naprawdę nie rozumiem zapisu rachunku lambda, więc nie wiem na pewno, czym jest kombinator Y, ale zastanawiam się, czy funkcja R Recall() (strona pomocy tutaj) nie pomoże ci zbudować tego, czego szukasz. Oto przykład jego użycia do obliczenia silni:

# Calculate 4!
(function(n) {if (n<=1) 1 else n*Recall(n-1)})(4)

I tutaj ma to zastosowanie do opisanego przez Ciebie przykładu:

(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
5
Josh O'Brien 26 luty 2012, 04:40

Spróbuj tego:

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

N = 10; seed = 3; i = 1
for(i in 1:N){
     seed = Y = myfun(seed)
     print(Y)
}
1
baha-kev 26 luty 2012, 03:54

Jeśli chcesz tylko funkcji, g, która przekształca funkcję f na function(x) f(f(f(f(...f(x))))) (n razy, z n nieznanym z góry), następujące powinno wystarczyć.

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
Vincent Zoonekynd 26 luty 2012, 05:02