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
- obliczyć y(1) --->3
- oblicz y(3) --->7
- obliczyć y(7)...
- ...
- zakończ w n-tym przypadku
Jak mogę to zrobić w R używając funkcjonalnego sposobu myślenia? Czy jest coś wbudowanego?
3 odpowiedzi
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
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)
}
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)
Podobne pytania
Nowe pytania
r
R to darmowy język programowania typu open source i środowisko oprogramowania do obliczeń statystycznych, bioinformatyki, wizualizacji i obliczeń ogólnych. Proszę podać minimalne i powtarzalne przykłady wraz z pożądanymi wynikami. Użyj dput () dla danych i określ wszystkie pakiety inne niż podstawowe za pomocą wywołań biblioteki (). Nie osadzaj obrazów dla danych lub kodu, zamiast tego użyj wciętych bloków kodu. W przypadku pytań związanych ze statystykami należy skorzystać z https://stats.stackexchange.com.