Here's Mathematica's Nest function Definition。 eqvとは何ですか? Rubyで?Mathematicaのネスト関数のRuby's Eqv?
アイデアはこれです:
nest(f, x, 3) #=> f(f(f(x)))
Here's Mathematica's Nest function Definition。 eqvとは何ですか? Rubyで?Mathematicaのネスト関数のRuby's Eqv?
アイデアはこれです:
nest(f, x, 3) #=> f(f(f(x)))
:あなたが返すことができるあなたが戻っ機能が必要な場合(つまり、不特定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
の代わりに[]
を使用することができます
私はルビーを知らないが、私は言語の記述に見て、次のコードを書きました。..
が、それはあなたの関数とする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
を使用して独自に定義することができ
これは 'f'が' nest'を持つ同じオブジェクト上にある限り動作します。そうでなければ 'send'は動作しません。誰かが、私がここにいる間、私はそれをやるつもりなので、あなたは 'return'コールが必要ないとあなたに伝えます。そしてある種のイテレータ(['Enumerable'(http://www.ruby-doc.org/core-1.9.3/Enumerable.html)参照)は' while'ループよりも慣用的です。 –
@muistooshort申し訳ありませんが、私はルビーを知りません:) – Cheery
しかし、今あなたはいくつかのRubyを知っていますので、そこに:) –
複数の引数を渡すことはできますか?関数がそれらを取ることができると仮定して 'nest(method(:f)、(x、y)、n)とにかくこれは解決されます。質問に完全に答えます:)。誰かがネストに興味があったら、それも聞いてみるかもしれません。 –
@ Mr.DemetriusMichael:配列 '[x、y]'を使って、その配列を '注射する'ことができます。また、 'nest'(' nest(f、n、* x) ')のスプラットを使って残りの引数を配列に集め、その配列を' inject'に渡すこともできます。 –