2010-11-24 82 views
9

,所以我試圖做這樣的事情:遞歸產量

def func(x,y) 
    if x.length == 1 then 
     n = x.pop() 
     yield(n,y) 
    else 
     n = x.pop() 
     yield(n,func(x,y)) 
    end 
end 

調用它像:

a = func([1,2,3,4,5],0) do |x,y| 
    x+y 
end 

是否有可能做這樣的事情?我一直沒有給出任何塊(yield)(LocalJumpError)。

我甚至嘗試做的東西有點不同:

def func(x,y) 
    func(x,y) do |tail| 
     .. 
    end 
end 

,但沒有運氣

感謝。

+1

有趣。在做Ruby近6年的時間裏,我從來沒有見過這個問題出現過,現在同樣的問題在10個小時內被兩個不同的人從(看起來像)相反的兩個方面提問:[ Ruby塊的問題](http://StackOverflow.Com/q/4259652/) – 2010-11-24 14:31:29

+0

這很有趣。他們是類似的問題,除了我的產量在遞減功能 – Matt 2010-11-24 18:44:14

回答

12

是的,你可以把塊作爲參數明確:

def func(x, y, &block) 

,您仍然可以產生將其與產量的關鍵字,但你也可以把它作爲你遞歸:

yield(n, func(x, y, &block)) 

這兩種情況下的&表示block參數不是普通參數,而是表示可以附加到任何Ruby方法調用的塊。

2

您錯過了在遞歸調用中傳遞該塊。
遞歸調用應該像如下: -

yield(n,func(x,y)) { |x,y| x+y}) 

既然你錯過傳遞塊的遞歸調用,當代碼點擊: -

 if x.length == 1 then 
    n = x.pop() 
    yield(n,y) <<<< Here 

方法FUNC不在遞歸調用中,有塊被作爲參數傳遞,但是ruby試圖調用一個不存在的塊並因此發生錯誤。