2012-02-24 4 views

答えて

2

:あなたが返すことができるあなたが戻っ機能が必要な場合(つまり、不特定xを残す)

>> def f(x) 2*x end 
>> nest(method(:f), 1, 3) 
=> 8 

def nest(f, x, n) 
    n.times.inject(x) { |m| f.call(m) } 
end 

次に、あなたがこのようにそれを呼び出すことができますラムダ:

def nestx(f, n) 
    ->(x) { n.times.inject(x) { |m| f.call(m) } } 
end 

このように使用します。

>> nestx(method(:f), 3).call(1) 
=> 8 

それともnest引数を並べ替えるとProc#curryを使用することができます

def nest(f, n, x) 
    n.times.inject(x) { |m| f[m] } 
end 

>> method(:nest).to_proc.curry[method(:f), 3][1] 
=> 8 
:より多くの関数呼び出しのように見える何かをしたい場合は

def nest(f, n, x) 
    n.times.inject(x) { |m| f.call(m) } 
end 

>> method(:nest).to_proc.curry.call(method(:f), 3).call(1) 
=> 8 

ます。またcallの代わりに[]を使用することができます

+0

複数の引数を渡すことはできますか?関数がそれらを取ることができると仮定して 'nest(method(:f)、(x、y)、n)とにかくこれは解決されます。質問に完全に答えます:)。誰かがネストに興味があったら、それも聞いてみるかもしれません。 –

+0

@ Mr.DemetriusMichael:配列 '[x、y]'を使って、その配列を '注射する'ことができます。また、 'nest'(' nest(f、n、* x) ')のスプラットを使って残りの引数を配列に集め、その配列を' inject'に渡すこともできます。 –

1

私はルビーを知らないが、私は言語の記述に見て、次のコードを書きました。..

が、それはあなたの関数とする

def func(­x) 
    return sin(x­) 
end 

def nest(­f, x, n) 
    count = 0 
    while count­<n 
     x = send(f, x) 
     count += 1 
    end 
    return x 
end 
0巣関数を定義してみましょう

は、私がhttp://www.wolframalpha.com上の結果とそれを比較し、同じ答えを持っている0.67843047736074

なりnest(:func­, 1, 3)、結果としてそれを呼び出します。あなたはinjectを使用して独自に定義することができ

+0

これは 'f'が' nest'を持つ同じオブジェクト上にある限り動作します。そうでなければ 'send'は動作しません。誰かが、私がここにいる間、私はそれをやるつもりなので、あなたは 'return'コールが必要ないとあなたに伝えます。そしてある種のイテレータ(['Enumerable'(http://www.ruby-doc.org/core-1.9.3/Enumerable.html)参照)は' while'ループよりも慣用的です。 –

+0

@muistooshort申し訳ありませんが、私はルビーを知りません:) – Cheery

+0

しかし、今あなたはいくつかのRubyを知っていますので、そこに:) –

関連する問題