2012-02-25 18 views
4

ラムダ計算では、Y-コンビネータは次のように自身を返します。Y a = a Y a、具体的にはhereです。 y(x)= 2 * x + 1(簡略化のために教会の番号を仮定する)のような単純な関数を仮定し、私はそれをしたいY y私は何らかのブレークアウト関数。私はこのRに自身を返す関数?

  1. 計算yのような何かをしたい(1)---> 3
  2. 計算Y(3)---> 7
  3. 計算Y(7)...
  4. ...
  5. は私が考えての機能的な方法を使用してRでこれを行うことができますどのように、n番目のケース

に終了しますか?何か組み込みですか?

+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を、必要な場合ffunction(x) f(f(f(f(...f(x)))))(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) 
関連する問題