Here's Mathematica's Nest function Definition。什麼是eqv。在Ruby中?Ruby的Eqv for Mathematica的Nest函數?
的想法是這樣的:
nest(f, x, 3) #=> f(f(f(x)))
Here's Mathematica's Nest function Definition。什麼是eqv。在Ruby中?Ruby的Eqv for Mathematica的Nest函數?
的想法是這樣的:
nest(f, x, 3) #=> f(f(f(x)))
你可以定義自己的使用inject
:
def nest(f, x, n)
n.times.inject(x) { |m| f.call(m) }
end
然後,你可以這樣調用它:
>> def f(x) 2*x end
>> nest(method(:f), 1, 3)
=> 8
如果你想要一個函數返回(即離開x
不詳),那麼你可以返回拉姆達:
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.call(m) }
end
>> method(:nest).to_proc.curry.call(method(:f), 3).call(1)
=> 8
您還可以使用[]
代替call
如果想要的東西,看起來更像是一個函數調用:
def nest(f, n, x)
n.times.inject(x) { |m| f[m] }
end
>> method(:nest).to_proc.curry[method(:f), 3][1]
=> 8
我不知道紅寶石,但我看着語言的描述,並寫了下面的代碼..
讓它成爲你的函數
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
稱其爲nest(:func, 1, 3)
和結果將是0.67843047736074
我與http://www.wolframalpha.com結果進行比較,並得到了同樣的答案。
只要'f'位於具有'nest'的同一個對象上,就會工作,否則'send'將不起作用。有人會告訴你,你不需要「回報」的電話,所以我會在我來的時候這樣做。並且某種類型的迭代器(參見['Enumerable'](http://www.ruby-doc.org/core-1.9.3/Enumerable.html))比'while'循環更具慣用性。 – 2012-02-24 05:17:34
@ muistooshort對不起,但我不知道紅寶石:) – Cheery 2012-02-24 05:19:56
但現在你知道一些紅寶石,所以有:) – 2012-02-24 05:41:11
是否可以傳遞多個參數?像'巢(方法(:F),(X,Y),N)'假設函數可以帶走它們?無論如何這都解決了。完全回答問題:)。只是想知道如果有人對Nest有興趣,他們也可能會問。 – 2012-02-24 17:28:32
@ Mr.DemetriusMichael:你可以使用一個Array,'[x,y]',並將該Array傳遞給'inject'。你也可以在'nest'('nest(f,n,* x)')中使用一個splat來將其餘的參數收集到一個Array中,並將該Array傳遞給'inject'。 – 2012-02-24 18:00:25