2012-02-24 22 views

回答

2

你可以定義自己的使用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 
+0

是否可以傳遞多個參數?像'巢(方法(:F),(X,Y),N)'假設函數可以帶走它們?無論如何這都解決了。完全回答問題:)。只是想知道如果有人對Nest有興趣,他們也可能會問。 – 2012-02-24 17:28:32

+0

@ Mr.DemetriusMichael:你可以使用一個Array,'[x,y]',並將該Array傳遞給'inject'。你也可以在'nest'('nest(f,n,* x)')中使用一個splat來將其餘的參數收集到一個Array中,並將該Array傳遞給'inject'。 – 2012-02-24 18:00:25

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 

稱其爲nest(:func­, 1, 3)和結果將是0.67843047736074

我與http://www.wolframalpha.com結果進行比較,並得到了同樣的答案。

+0

只要'f'位於具有'nest'的同一個對象上,就會工作,否則'send'將不起作用。有人會告訴你,你不需要「回報」的電話,所以我會在我來的時候這樣做。並且某種類型的迭代器(參見['Enumerable'](http://www.ruby-doc.org/core-1.9.3/Enumerable.html))比'while'循環更具慣用性。 – 2012-02-24 05:17:34

+0

@ muistooshort對不起,但我不知道紅寶石:) – Cheery 2012-02-24 05:19:56

+0

但現在你知道一些紅寶石,所以有:) – 2012-02-24 05:41:11